一、704. 二分查找
学习链接:二分查找
状态:做出来了
细节之处:1,2,3,4处
class Solution {
public int search(int[] nums, int target) {
int left=0;int right=nums.length-1;
while(left<right)//1 左闭右开
{
int mid=(left+right)>>1;// 2 根据情况来向上取整还是向下取整 防止爆INt int mid=left+(left+right)>>1
if(nums[mid]>target)right=mid;//3 右开
else if(nums[mid]<target)left=mid+1; //4 左闭
else return mid;
}
if(nums[left]==target)return left;
else return -1;
}
}
各种二分查找的模板大体上一致,抠细节就有三种类型:1.左闭右闭 2.左开右闭 3.左闭右开。上面的类型为左闭右开。对应的修改部分即代码的1、3、4处.
当然mid是一个关键部分,很多代码mid没处理好,写出来的会死循环。关键原因就是mid的向上取整和向下取整没有处理好。
向下取整:其更新操作是r = mid
或者l = mid + 1
;计算mid
时不需要加1
。
向上取整:其更新操作是r = mid - 1
或者l = mid
;此时为了防止死循环,计算mid
时需要加1
二、27. 移除元素
学习链接:移除元素
状态:暴力解法踩坑,双指针解法没想出来
细节之处:a:暴力解法: 1,2,3,4处 b:双指针解法:fastIndex是寻找新数组的元素 slowIndex是新数组元素的下标
暴力解法
class Solution {
public int removeElement(int[] nums, int val) {
int size=nums.length; // 1 先将数组长度定义好,后面可以更改数组长度
for(int i=0;i<size;i++)
{
if(nums[i]==val)
{
for(int j=i;j<size-1;j++)//2 注意最后一个元素不需要遍历
{
nums[j]=nums[j+1];
}
i--; // 3 表示该位置前移一位,模拟删除元素
size--; // 4 表示数组长度修改
}
}
return size;
}
}
双指针解法
class Solution {
public int removeElement(int[] nums, int val) {
int slowIndex=0;
for(int fastIndex=0;fastIndex<nums.length;fastIndex++)
{
if(nums[fastIndex]!=val)//目的寻找新数组元素
{
nums[slowIndex++]==nums[fastIndex];
}
}
return slowIndex;
}
}