本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1 283. 移动零
1.1 题目
1.2 题解
class Solution {
public void moveZeroes(int[] nums) {
// 双指针:m负责遍历数组中不为零的数,n负责移动后数组不为零数字的下标
int m = 0;
int n = 0;
int len = nums.length;
while (m < len) {
if (nums[m] != 0) {
nums[n++] = nums[m];
}
m++;
}
while (n < len)
nums[n++] = 0;
}
}
2 167. 两数之和 II - 输入有序数组
2.1 题目
2.2 题解
2.2.1 方法一
public static int[] twoSum(int[] numbers, int target) {
int left = 0;
int right = numbers.length - 1;
// 一步一步寻找,可以在寻找right时嵌套二分查找
while (left < right) {
if (numbers[left] + numbers[right] == target)
return new int[]{left + 1, right + 1};
else if (numbers[left] + numbers[right] < target)
left++;
else right--;
}
return null;
}
2.2.2 方法二
class Solution {
public int[] twoSum(int[] numbers, int target) {
for (int i = 0; i < numbers.length; i++) {
int left = i + 1;
int right = numbers.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (numbers[i] + numbers[mid] == target)
return new int[]{i + 1, mid + 1};
else if (numbers[i] + numbers[mid] > target)
right = mid - 1;
else left = mid + 1;
}
}
return null;
}
}
3 总结
3.1 双指针的原理
见此。