一. 题目来源
leetcode: 167. Two Sum II - Input array is sorted
二. 题目大意
给定一个非降序排列的数组,给定一个值,让你求在数组中相加之和为那个定值的那两个数的下标
三. 解题思路:
leetcode上难度标注是m,但我感觉这个很简单,应该被划到e题中。
解法很简单,就两边夹逼,开始时记start = 0, end = arr.size - 1, 然后比较arr[start] + arr[end]和target的大小
如果 arr[start] + arr[end] 等于 target, 那就找到了要求的结果
如果 arr[start] + arr[end] 小于 target , 那就start++
如果 arr[start] + arr[end] 大于 target , 那就end--
算法空间效率是O(1), 时间效率是O(n)
下面是代码
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> res;
res.clear();
int size = numbers.size();
int i = 0, j = size - 1;
while(i <= j){
if(numbers[i] + numbers[j] == target){
res.push_back(i + 1);
res.push_back(j + 1);
return res;
}
else if(numbers[i] + numbers[j] < target)
i++;
else j--;
}
return res;
}
};
四. 思考题
如果是给定一个数组和一个定值target,问数组中m个数相加之和等于target,然后让你求那m个数的下标呢?
1. 下午上实验课在想这个,可以用背包模型很快解决。
2. mark另外一个思路, 用递归解,把n问题转换为n-1问题,先赶作业,周末把代码贴出来