选一道easy的题来解解闷。。。

找出数组中的两个数之和等于target。。

思路:

  1. 两重遍历。不过由于数组是升序的,在第一层遍历开始前,先判断一下当前元素和结尾元素之和能否大于等于目标值,如果不行则continue
  2. 给定收尾索引,判断对应位置之和和target的关系。如果相等,则返回,如果大于target,则尾索引变小,如果小于target,则头索引变大。

思路一实现:

时间复杂度 O(n^2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> result;

//int smallest = numbers[0];
int biggest = numbers[numbers.size() - 1];
for(int i = 0; i < numbers.size() - 1; i++){
if(biggest + numbers[i] < target){
continue;
}
for(int j = i + 1; j < numbers.size(); j++){
if(numbers[i] + numbers[j] == target){
result.push_back(i + 1);
result.push_back(j + 1);
break;
}
}
if(result.size() == 2){
break;
}
}
return result;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> result;
int i = 0;
int j = numbers.size() - 1;
while(i < j){
int sum = numbers[i] + numbers[j];
if(sum == target){
result.push_back(i + 1);
result.push_back(j + 1);
break;
}
else if(sum < target){
i++;
}
else{
j --;
}
}
return result;
}
};