打卡第二十三天
1道简单题+2道中等题

题目: 两数之和

思路一: 双指针,题目说数组下标从1开始,先初始指针还是从0开始,返回时左右指针都加1就行
代码:
class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {int n = numbers.size();int left = 0,right = n - 1;while(left < right){int sum = numbers[left] + numbers[right];if(sum == target){return {left + 1,right + 1};//左右指针+1}else if(sum > target){right--;}else{left++;}}return {};}
};
思路二: 二分查找,先固定一个数,第二个数=目标值-第一个数
代码:
class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {for (int i = 0; i < numbers.size(); i++) {// 外层循环:遍历数组中的每一个元素作为第一个数// 内层使用二分查找寻找第二个数// left 从 i+1 开始,避免重复使用同一个元素int left = i + 1, right = numbers.size() - 1;while (left <= right) {int mid = (right - left) / 2 + left;if (numbers[mid] == target - numbers[i]) {return {i + 1, mid + 1};// 返回下标,题目要求从1开始计数,两边都+1} else if (numbers[mid] > target - numbers[i]) {right = mid - 1;} else {left = mid + 1;}}}return {-1, -1};}
};
耗时≈1小时 明天继续