704.二分查找
//左闭右闭,即左右指针所指元素在查找区间中
class Solution {
public int search(int[] nums, int target) {
//防止进行无效循环
if(target < nums[0] || target > nums[nums.length - 1])
return -1;
int left = 0;//左指针
int right = nums.length - 1;//右指针
while(left <= right){//当区间有效时,进入循环
int mid = (left + right) / 2;
//整形计算除法截断小数部分,mid = [(left + right) / 2],即向下取整
if(nums[mid] < target)//目标小于中间值,右移左指针
left = mid + 1;
else if(nums[mid] > target)//目标大于中间值,左移右指针
right = mid - 1;
else//nums[mid] == target
return mid;
}
return -1;//循环结束,未查找到,返回-1
}
}
若目标数不在数组中,循环中左右指针会相等,最后一次循环对左右指针进行操作后会出现right < left,退出循环
- 左闭右开
int right = nums.length;
while(left < right){//右指针所指不在查找区间中
int mid = (left + right) / 2;
if(nums[mid] < target)
left = mid + 1;
else if(nums[mid] > target)
right = mid;
else
return mid;
}
当左右指针相等时退出循环,当数组仅有单元素时:
left = 0;
right = 1;
mid = 0;
nums[mid] == nums[left]
循环中成功检查nums[left]是否时target
- 优化
int mid = left + (right - left) >> 1;//避免整数溢出,>> 1 相当于 /2
27.移除元素
class Solution {
public int removeElement(int[] nums, int val) {
int k = 0;//慢指针
for(int i = 0; i < nums.length; i++){//快指针
if(nums[i] != val){//快指针遍历数组
nums[k] = nums[i];_
k++;//覆盖数组元素后,慢指针自增一
}
}
return k;
}
}
977.有序数组的平方
class Solution {
public int[] sortedSquares(int[] nums) {
int[] result = new int[nums.length];//结果数组
int left = 0;//左指针
int right = nums.length - 1;//右指针
int position = nums.length - 1;//结果指针
while(left <= right){
//一次只移动一个指针,当左右指针相等时,遍历全部数组
int leftSquare = nums[left] * nums[left];
int rightSquare = nums[right] * nums[right];
//将平方较大的结果记录到结果数组末尾
if(leftSquare > rightSquare){
result[position] = leftSquare;
left++;//将指向被记录元素的指针向数组中间移动
}else{
result[position] = rightSquare;
right--;
}
position--;//将结果指针移向结果数组开头
}
return result;
}
}
-
结果数组只能由后往前填充
-
如果初始化
position = 0,即每次将较小数填入position所指位置,会导致输出不是非递减模式

698

被折叠的 条评论
为什么被折叠?



