这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战
这一篇也是双指针,对于双指针的加深印象
两数之和 II ,输入有序数组
该题出自力扣的167题 —— 两数之和 II ,输入有序数组【简单题】
审题
给定一个已按照 非递减顺序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。 你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
- 题意很简单,给定一个非递减的数组,和一个目标值,找出满足目标的两个下标
- 很明朗,直接用双指针实现
- 不存在漏掉的情况
- 因为比目标值大则会右指针左移,比目标值小则会左指针右移
编码
public int[] twoSum(int[] numbers, int target) {
int[] a = new int[2];
int n = numbers.length,left=0,right = n-1;
while(right > left){
int max = numbers[left] + numbers[right];
if(max==target){
a[0] = left +1;
a[1] = right + 1;
return a;
}else if(max > target){
right --;
}else{
left++;
}
}
return null;
}
移动零
该题出自力扣的283题 —— 移动0【简单题】
审题
给定一个数组
nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。
- 题意也是相对简单,就是把数组的0移动到末尾,但是不改变数组内非0的相对顺序
- 解决方法:
- 方法一:移动0,利用双指针的方法,指针分别指向已改变的数组末尾和待改变的序列头
- 方法二:直接覆盖数组的0,并在数组的末尾对剩余索引填充0;
编码
public static void moveZeroes(int[] nums){
int n = nums.length,left=0,right=0;
while(n>right){
if(nums[right] !=0){
swap(nums,left,right);
left++;
}
right++;
}
}
public static void swap(int[] nums,int left ,int right){
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}