LeetCode-704.二分查找
【错误】第一遍提交的代码
主要错误点: 没弄清楚区间的定义导致:r 在定义处的赋值和 if 判断之后 r 的复制没有想清楚; 没有搞清楚判断循环结束的条件; 没有搞明白区间的定义,r 和 l 如何赋值,如何判断;
class Solution { public int search ( int [ ] nums, int target) { int l = 0 ; int r = nums. length - 1 ; if ( target < nums[ 0 ] || target > nums[ nums. length - 1 ] ) { return - 1 ; } while ( l <= r) { int mid = ( r + l) / 2 ; if ( nums[ mid] == target) { return mid; } if ( nums[ mid] < target) { l = mid+ 1 ; } if ( nums[ mid] > target) { r = mid+ 1 ; } } return - 1 ; }
}
【正确】第二遍提交代码
搞清楚区间的定义,并判断左闭右开的区间范围,如何判断r 和 l 的赋值,以及while结束的条件;
class Solution { public int search ( int [ ] nums, int target) {
int l = 0 ; int r = nums. length; if ( target < nums[ 0 ] || target > nums[ nums. length - 1 ] ) { return - 1 ; } while ( l < r) { int mid = ( r + l) / 2 ; if ( nums[ mid] == target) { return mid; } if ( nums[ mid] < target) { l = mid+ 1 ; } if ( nums[ mid] > target) { r = mid; } } return - 1 ; }
}
LeetCode-27.移除元素
【正确】双指针一次AC!
因为不用考虑末尾的元素,所以只要保证fast指针
每次有和val
相等的元素就跳过,然后赋值给slow指针
指向的元素即可。 代码随想录给出的是相向双指针,我用的是同向,测试了一下结果差不多。
class Solution { public int removeElement ( int [ ] nums, int val) { int slow = 0 , fast = 0 ; while ( fast < nums. length) { if ( nums[ fast] == val) { fast++ ; continue ; } nums[ slow] = nums[ fast] ; fast++ ; slow++ ; } return slow; }
}