704. 这道题目对于了解二分法算法的人应该很简单,也算是比较简单的算法了。我个人的话也算是写过几遍,不用动脑子就按照记忆中的模版写出来个大概,然后再去理解算法进一步的修改代码。(这里值得一提的是使用二分查找的话一定要确保数组是有序的,有些时候需要自己sort下先)
再次写这道题,有了新的感悟,以前都是想当然反正写出来就行,现在又一下几点需要稍加注意和理解:
- 左闭右闭 [left, right] ;
int right = nums.length-1; while(left<=right) {}
- 左闭右开 [left, right) ;
int right = nums.length; while(left<right) {}
- mid值的计算 ;
// 防止整数溢出(超过int的最大值) //(left + right) / 2 = left / 2 + right / 2 = left + (right - left) / 2 int mid = left + ((right - left) / 2); // 以后都要用这种写法
024. 这道题目主要是双指针思想,难点的话就是要求原地修改数组不使用额外的空间。刚开始想的是双向指针,然后需要考虑当left和right同时都为val的情况应该怎么处理。有两种不同的处理方法,第一种,就是先用一个while循环将right移到从右数第一个值不为val的位置,然后再进行位置的交换。第二种,就是兼容了right指针指向的值与val相等的情况(更加简单一点)。
最最最简单的方法还是使用快慢指针,刚开始没想到,看了题解,卧槽,真是简洁啊,真妙。
//快慢指针
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0;
for (int fast=0; fast<nums.length; fast++){
if(nums[fast] != val){
nums[slow++] = nums[fast];
}
}
return slow;
}
}