voidq_sort(vector<int>& nums, int l, int r) { if (l >= r) return; int i = l - 1, j = r + 1, mid = l + r >> 1; while (i < j) { while (nums[++ i] < nums[mid]); while (nums[-- j] > nums[mid]); if (i < j) swap(nums[i], nums[j]); } q_sort(nums, l, j); q_sort(nums, j + 1, r); }
vector<int> findNumbersWithSum(vector<int>& nums, int target){ q_sort(nums, 0, nums.size() - 1);
for (int i = 0, j = nums.size() - 1; i < j; ++ i) { if (nums[i] + nums[j] == target) return vector<int>{nums[i], nums[j]}; while (nums[i] + nums[j] > target) -- j; }
returnvector<int>(); } };
时间复杂度O(N), 空间复杂度O(N)的做法
1 2 3 4 5 6 7 8 9 10 11 12
classSolution { public: vector<int> findNumbersWithSum(vector<int>& nums, int target){ unordered_set<int> hash; for (int i = 0; i < nums.size(); ++ i) { if (hash.count(target - nums[i])) return vector<int>{target - nums[i], nums[i]}; hash.insert(nums[i]); } returnvector<int>(); } };