1.题目链接
2.题目描述
3.算法
(1)双指针法
超时代码
C++
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> res;
int num1,num2;
for(int i=0;i<nums.size();++i){
for(int j=nums.size()-1;j>=0;--j){
if(nums[i]+nums[j]==target){
res.push_back(nums[i]);
res.push_back(nums[j]);
break;
}
num1 = nums[i];
num2 = nums[j];
while(nums[i+1]==num1&&i<nums.size()){
i++;
}
while(nums[j-1]==num2&&j>=0){
j--;
}
}
if(res.size()!=0){
break;
}
}
return res;
}
};
以上为错误案例
改进: 可把双重循环改为相遇时跳出, 因为相遇时所有可能的组合都试过了.
改进代码:
Python3
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
i, j = 0, len(nums) - 1
while i < j:
s = nums[i] + nums[j]
if s > target: j -= 1
elif s < target: i += 1
else: return nums[i], nums[j]
return []
复杂度分析:
时间复杂度 O(N) : N 为数组 nums 的长度;双指针共同线性遍历整个数组。
空间复杂度 O(1): 变量 i,j 使用常数大小的额外空间。
上面做法的超时, 主要因为双重for循环引起. 所以这种级别的题目中尽量不使用双重for循环. 否则会引起超时.