题型1
1、题目描述
给定一个整型数组(正数),找出(x,y)使得 x+y = k,打印(x,y)
2、思路
使用两个指针begin、end
第一步:对数组进行升序排序;
第二步:begin指针指向数组第一个元素,end指针指向数组的最后一个元素;
第三步:如果arr[begin]+arr[end] == target,输出arr[begin]、arr[end],并且执行begin++、end--;
如果arr[begin]+arr[end] > target 或者 arr[end] > target,执行end--;
如果arr[begin]+arr[end] < target,执行begin++;
反复执行以上步骤,直至begin>=end;
3、代码实现
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = {1,2,98,2,5,95,4,3,88,12,98,2};
//数组排序-升序
Arrays.sort(arr);
//目标值
int k = 100;
Find2Num(arr,k);
}
public static void Find2Num(int[] arr,int k){
int begin = 0;
int end = arr.length-1;
while(begin<end){
//两数相加等于目标值,返回两数
while(begin<end && arr[begin]+arr[end] == k){
System.out.println(arr[begin]+","+arr[end]);
begin++;
end--;
}
//两数相加大于目标值 || end指针对应元素大于目标值,end--
while(begin<end && (arr[begin]+arr[end] > k || arr[end] > k)){
end--;
}
//两数相加小于目标值,begin++
while(begin<end && arr[begin]+arr[end] < k){
begin++;
}
}
}
}
题型2
1、题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:给定 nums = [2, 7, 11, 15], target = 9;因为 nums[0] + nums[1] = 2 + 7 = 9;所以返回 [0, 1]
2、思路
方法1:从左到右依次遍历数组,判断当前值是否与该值之前的某一个值相加为target
使用到HashMap
方法2:从左到右依次遍历数组,判断当前值是否与该值之后的某一个值相加为target
双层for循环
3、代码
import java.util.*;
class Solution {
public int[] twoSum(int[] nums, int target) {
//方法1
Map<Integer,Integer> map = new HashMap<>();
int[] arr = new int[2];
for(int i=0;i<nums.length;i++){
int temp = target-nums[i];
if(map.containsKey(temp)){
arr[0] = map.get(temp);
arr[1] = i;
break;
}
map.put(nums[i],i);
}
return arr;
/*
//方法2
int[] arr = new int[2];
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]+nums[j] == target){
arr[0] = i;
arr[1] = j;
break;
}
}
}
return arr;*/
}
}