二分查找 LeetCode 704
题目链接:LeetCode 704 - 简单
思路
根据题意,是打算用二分查找的方式做的 有打算考虑区间问题,但是当时做的时候区间问题考虑混乱 看了代码随想录之后对区间有清晰的想法了 主要有两种做法:左闭右闭&左闭右开
左闭右开:
java
class Solution {
public int search(int[] nums, int target) {
int left = 0,right=nums.length;
do{
int mid = left + ((right - left) >> 1);;
if(nums[mid]<target){
left = mid + 1;
}else if(nums[mid]>target){
right = mid;
}else{
return mid;
}
}while(left<right);
return -1;
}
}
左闭右闭:
java
class Solution {
public int search(int[] nums, int target) {
int left = 0,right=nums.length-1;
do{
int mid = left + ((right - left) >> 1);;
if(nums[mid]<target){
left = mid + 1;
}else if(nums[mid]>target){
right = mid - 1;
}else{
return mid;
}
}while(left<=right);
return -1;
}
}
总结
- 使用 left + ((right - left) >> 1) 替换 left + ((right - left) / 2)
- 左闭右闭时,right应为num.length - 1,而在左闭右开时,right为num.length。
移除元素 LeetCode 27
题目链接:LeetCode 27 - 简单
思路
最开始的思路是返回一个新数组,但是由于题目中含有不适用额外数组空间,加上代码的返回值为int,因此放弃了该想法。然后就是考虑在移除元素的时候采用递归的方法,但是不符合其使用O(1)的额外空间原地修改数组。因此采用双指针的方式来进行。
双指针:
java
class Solution {
public int removeElement(int[] nums, int val) {
int n = nums.length;
int left = 0,i = 0;
for(;i < n; i++){
if(nums[i] != val){
nums[left]=nums[i];
left++;
}
}
return left;
}
}
总结
- 大体上代码与思路情况都比较符合,代码可以简化或者让人更加看的懂,因此需要注意使用的变量名
- 代码随想录上采用了相向双指针法,可以参考学习。