场景:
刷题打卡
问题描述:
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
示例 2:
输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
限制:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^6
解法一:
暴力嵌套循环
public static int[] twoSum(int[] nums, int target) {
int count=0;
int len=nums.length;
ArrayList list=new ArrayList();
//嵌套循环找出符合条件的nums[i],nums[j]
out: for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
if(nums[i]+nums[j]==target){
list.add(nums[i]);
list.add(nums[j]);
count++;
break out;//结束外成循环
}
}
}
//只要返回一个数组,两个元素就好,如果有就长度变成2
int ans[]=new int[count+1];
//如果有符合条件nums[i]+nums[j]=target,遍历集合将元素添加到数组
if(count>0){
for(int i=0;i<list.size();i++) {
ans[i]=(int) list.get(i);
}
}
//返回最后结果
return ans;
}
运行效果
超时
解法二:
很妙的双指针+二分
参考
https://leetcode-cn.com/problems/he-wei-sde-liang-ge-shu-zi-lcof/solution/shuang-zhi-zhen-he-wei-sde-liang-ge-shu-wy7r4/
public int[] twoSum(int[] nums, int target) {
int l=0;
int r=nums.length-1;
int ans[]=null;
while(l<r) {
//每次都根据l 与 r下标得到一个值
int res=nums[l]+nums[r];
//前提条件,数组元素值是递增的,当res>target,则需要将后索引值r--,使得res变小
if(res>target) {
r--;
//当res>target,则需要将后面索引值--,则需要将前索引l++,使得res变大
}else if(res<target) {
l++;
}else {//符合则赋值 返回
ans= new int[2];
ans[0]=nums[l];
ans[1]=nums[r];
return ans;
}
}
//如果没有符合的就返回null
return ans;
}
运行效果: