今日前置知识
数组前置知识
今日主要题目
主要学习网址
做题思路与具体代码
题目一:704.二分查找
做题思路一
左闭右闭:
1.左右边界left和right,分别初始取值0和数组长度-1,意味着left和right从一开始就可能是最终结果
2.循环条件是(left<=right)
3.不断取中间值middle(注意溢出情况)判断middle所在位置的值是否与目标值相同
4.如果middle所在位置的值>目标值,证明目标值在middle的右边,将左边界缩小到middle+1
(因为middle不是目标值所在的位置)
5.如果middle所在位置的值<目标值,证明目标值在middle的左边,将右边界缩小到middle-1
(因为middle不是目标值所在的位置)
6.如果middle所在位置的值=目标值,证明目标值就在middle所在的位置,直接返回
7.循环结束都没找到,那么直接返回-1
具体代码
class Solution {
// 左闭右闭方法解答
public int search(int[] nums, int target) {
// 左右边界
int left=0;
int right=nums.length-1;
// 循环条件 left<right
// 此时left可能会取到我们想要的值
// 此时right可能会取到我们所要的值
while(left<=right){
// 中间值时刻改变
//这里为了防止溢出,写的是left+(right+left)>>1
int middle=left+((right-left)>>1);
if(nums[middle]==target){
// 找到目标值
return middle;
}
else if(nums[middle]<target){
// 因为左闭右闭区间,left取值可能取到我们想要的值上的,中间值已经被排除,所以要+1
left=middle+1;
}
else if(nums[middle]>target){
// 因为左闭右闭区间,right取值可能取到我们想要的值上的,中间值已经被排除,所以要-1了
right=middle-1;
}
}
return -1;
}
}
做题思路二
左闭右开:
1.左右边界left和right,分别初始取值0和数组长度,意味着left从一开始就可能是最终结果,但是right从一开始就不可能是最终结果,因为right越界了
2.循环条件是(left<right),这里right不能与left相等
3.不断取中间值middle(注意溢出情况)判断middle所在位置的值是否与目标值相同
4.如果middle所在位置的值>目标值,证明目标值在middle的右边,将左边界缩小到middle+1
(因为middle不是目标值所在的位置)
5.如果middle所在位置的值<目标值,证明目标值在middle的左边,将右边界缩小到middle
(因为middle不是目标值所在的位置且right不可能是目标值所以可以等于middle)
6.如果middle所在位置的值=目标值,证明目标值就在middle所在的位置,直接返回
7.循环结束都没找到,那么直接返回-1
具体代码
class Solution {
// 左闭右开方法解答
public int search(int[] nums, int target) {
// 左右边界
int left=0;
int right=nums.length;
// 循环条件 left<right
// 此时left可能会取到我们想要的值
// 此时right不可能会取到我们所要的值
while(left<right){
// 中间值时刻改变
//这里为了防止溢出,写的是left+(right+left)>>1
int middle=left+((right-left)>>1);
if(nums[middle]==target){
// 找到目标值
return middle;
}
else if(nums[middle]<target){
// 因为左闭右闭区间,left取值是不会取到中间值上的,所以要+1
left=middle+1;
}
else if(nums[middle]>target){
//因为左闭右开区间,right取值不可能会取到我们想要的值上,所以是middle本身,因为middle已经被排除了
right=middle;
}
}
return -1;
}
}
题目二:27. 移除元素
做题思路
本题采用快慢指针的方法
1.定义快慢指针初始值均为0
2.for循环快指针往前走,遇到与目标值不同的值,则将该值赋给慢指针所在位置,实现覆盖的效果,慢指针的作用就是将与目标值不同的值从头覆盖掉原数组,然后慢指针每覆盖一次向前进一步
3.快指针也往前不断前进
4.最后返回慢指针的值,即新数组的长度
具体代码
class Solution {
// 快慢指针方法
public int removeElement(int[] nums, int val) {
// 定义快慢指针
int fast=0;
int slow=0;
for(;fast<nums.length;fast++){
// 快指针所在位置的值是否与val不同
if(nums[fast]!=val){
// 如果不同,将不同的值覆盖掉慢指针所在位置的值
nums[slow]=nums[fast];
// 慢指针往前走
slow++;
}
}
//返回慢指针此时的值
return slow;
}
}