思路分析

给输入数组排序,然后两个指针,一个头指针,一个尾指针,一起往中间移动。如果两者的和小于target,头指针就向后移动;如果和大于target,尾指针就向前移动。直到找到和等于target的组合。
直接排序的话会丢了索引,这里特殊处理一下。

看到暴力解就能过,emmm这个就偏离初心了吧;主流的好像是HashMap解法,后面我也试试。

代码实现

带索引排序,用了下lambda表达式,学习新语法。写完在本地测试。

  1. #include <vector>
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5. vector<int> sortWithIndex(vector<int> &nums)
  6. {
  7. vector<int> index(nums.size());
  8. for (int i = 0; i < index.size(); ++i)
  9. {
  10. index[i] = i;
  11. }
  12. sort(index.begin(), index.end(),
  13. [&nums](int a, int b) {
  14. return nums[a] < nums[b];
  15. });
  16. return index;
  17. }
  18. int main()
  19. {
  20. vector<int> nums{4, 6, 3, 3, 5, 7};
  21. vector<int> index(nums.size());
  22. index = sortWithIndex(nums);
  23. for (vector<int>::iterator i = index.begin(); i != index.end(); ++i)
  24. {
  25. cout << *i << ":" << nums[*i] << endl;
  26. }
  27. }

整体实现

  1. class Solution {
  2. private:
  3. vector<int> sortWithIndex(vector<int> &nums)
  4. {
  5. vector<int> index(nums.size());
  6. for (int i = 0; i < index.size(); ++i)
  7. {
  8. index[i] = i;
  9. }
  10. sort(index.begin(), index.end(),
  11. [&nums](int a, int b) {
  12. return nums[a] < nums[b];
  13. });
  14. return index;
  15. }
  16. public:
  17. vector<int> twoSum(vector<int>& nums, int target) {
  18. vector<int> index(nums.size());
  19. // 排序后的索引值
  20. index = sortWithIndex(nums);
  21. int i = 0;
  22. int j = index.size() - 1;
  23. int sum;
  24. vector<int> ans;
  25. while (i < j){
  26. if (i==j){
  27. break;
  28. }
  29. sum = nums[index[i]] + nums[index[j]];
  30. if (sum == target){
  31. ans.emplace_back(index[i]);
  32. ans.emplace_back(index[j]);
  33. break;
  34. }
  35. else if (sum < target){
  36. i++;
  37. }
  38. else if (sum > target){
  39. j--;
  40. }
  41. }
  42. return ans;
  43. }
  44. };