day01数组基础_二分查找_移除元素

数组

注意点

*数组下标从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

总结

1.数组只可覆盖不可删除;

2.二分查找的边界条件,是左闭右闭还是左闭右开,每一种的写法;

3.双指针法的快慢指针分别代表的含义。

你可能感兴趣的:(leetcode,算法,数据结构)