- 二分查找
这是一道一看就会,一做就废的题目。
本题关键:确定target属于左闭右闭区间,还是左闭右开区间。
思路:
(1)假设target在左闭右闭区间
循环条件应该为 left <= right,如果不写等于号,就排查不到num[left]=num[right]=target的情况。
确定好区间后,right = mid -1.
(2)假设target在左闭右开区间
循环条件应该为 left < right,我们定义的是target在[left, right),如果left = right 时,不符合定义了
确定好区间后,right = mid.
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int centerIndex;
while(left <= right){
centerIndex = (right + left) / 2;
if(nums[centerIndex] == target){
return centerIndex;
}else if(nums[centerIndex] > target){
right = centerIndex - 1;
}else{
left = centerIndex + 1;
}
}
return -1;
}
}
-
移除元素
class Solution {
public int removeElement(int[] nums, int val) {
int i = 0;
int j = nums.length - 1;
while(i <= j){
if(nums[i] != val){
i++;
}else if(nums[i] == val && nums[j] != val){
nums[i] = nums[j];
i++; j--;
}else if(nums[i] == val && nums[j] == val){
j--;
}
}
return i;
}
}
977.有序数组的平方
本题关键;
平方最大的数要么在数组的第一个位置,要么在数组的最后一个位置。由此想到双指针法。
class Solution {
public int[] sortedSquares(int[] nums) {
int[] res = new int[nums.length];
int left = 0;
int right = nums.length - 1;
int cur = nums.length - 1;
while(left <= right){
if(Math.abs(nums[left]) <= Math.abs(nums[right])){
res[cur--] = nums[right] * nums[right];
right--;
}else if(Math.abs(nums[left]) > Math.abs(nums[right])){
res[cur--] = nums[left] * nums[left];
left++;
}
}
return res;
}
}