1. 两数之和 - 力扣(LeetCode)
暴力解法: O ( N 2 ) O(N^2) O(N2)遍历数组,找两个数相加为target
O ( N ) O(N) O(N)解法:将所有数排序,并记录这些数的下标,双指针从左右向中间走。指向的两数相加大于target则r–,小于则l++,第一对相等的数即为答案。
当然,用二分、哈希也是可以的,不过时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
贴双指针解法,证明很简单:思考为什么双指针不会移动到两个答案之间?反证一下就出来了
class Solution {typedef pair<int, int> PII;
public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> ans(2);vector<PII> a;for (int i = 0; i < nums.size(); ++ i) {a.push_back({ nums[i], i });}sort(a.begin(), a.end());int l = 0, r = nums.size() - 1;while (l < r) {if (a[l].first + a[r].first > target) {r -- ;}else if (a[l].first + a[r].first < target) {l ++ ;}else {ans[0] = a[l].second, ans[1] = a[r].second;return ans;}}return ans;}
};
49. 字母异位词分组 - 力扣(LeetCode)
若单词重新排列后,和某个单词相同,则分为一组
可以确定的是,将所有单词中的字符升序排序后,将出现多个相同单词,这些单词作为“字母异位词”分为一组
对于每个单词,将其升序排序,用map记录该单词所位于的组号,若无记录,则作为新组
class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vector<string>> ans;unordered_map<string, int> mp;for (int i = 0; i < strs.size(); ++ i) {string s = strs[i];sort(s.begin(), s.end());if (mp.count(s) == 0) {mp[s] = ans.size();ans.push_back(vector<string>());}ans[mp[s]].push_back(strs[i]);}return ans;}
};