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;
}
};