数组
注意点
*数组下标从0开始
*数组内存空间的地址是连续的
*数组元素不能删,只能覆盖
二分查找
前提
1.有序数组
2.数组中无重复元素
边界条件(区间定义)
1.[left,right]
*while(left <= right)要使用<=,因为left == right是有意义的
*if(nums[middle] > target) right要赋值为middle - 1,因为当前这个nums[middle]一定不是target
2.[left,right)
*while(left < right),使用<是因为left == right在区间[left,right)没有意义
*if(nums[middle] > target),right更新为middle,因为下一个查询区间不会去比较nums[middle]
力扣704.二分查找
第一想法
看到题目只清楚思路,知道left,right该怎么移动,并不知道怎么实现左闭右闭,左闭右开,也不清楚while里的循环条件。
看完题解
只看了视频,未看题解,视频已经讲的很清楚了,考虑清楚边界条件就简单了。
自己实现遇到的困难
因为while的循环条件没写对,导致超出时间限制了。
完整代码
class Solution {
//左闭右闭
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while(left <= right){
int middle = (left+right)/2;
if(nums[middle] < target){
left = middle+1;
}else if(nums[middle] > target){
right = middle-1;
}else{
return middle;
}
}
return -1;
}
//左闭右开
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length;
while(left < right){
int middle = (left+right)/2;
if(nums[middle] < target){
left = middle+1;
}else if(nums[middle] > target){
right = middle;
}else{
return middle;
}
}
return -1;
}
}
力扣27.移除元素
第一想法
只想到暴力解法,数组是不可直接删除的只能覆盖。
自己实现遇到的困难
自己想的时候是用后一个覆盖前一个,当进行到最后一个元素时,不知道该怎么办了。
看完视频
一定要明白快慢指针代表的含义,自己手动模拟一遍。
完整代码
//暴力解法
class Solution {
public int removeElement(int[] nums, int val) {
int len=nums.length;
for(int i=0;i<len;i++){
if(nums[i]==val){//第一轮循环找到相等值,进行覆盖
for(int j=i+1;j<len;j++){
nums[j-1]=nums[j];
}
i--;//覆盖后下标减1,数组长度也减1
len--;
}
}
return len;
}
}
//双指针法
class Solution {
public int removeElement(int[] nums, int val) {
int slow=0;//slow指针是fast找到的新元素该赋予的下标值
//int fast=0;//fast指针是找更新之后数组的元素,即不等于val的数组元素
for(int fast=0;fast<nums.length;fast++){
if(nums[fast]!=val){
nums[slow++]=nums[fast];
}
}
return slow;
}
}
总结
1.数组只可覆盖不可删除;
2.二分查找的边界条件,是左闭右闭还是左闭右开,每一种的写法;
3.双指针法的快慢指针分别代表的含义。