算法训练营第一天

1.二分查找法:

  1. 题目:力扣704 简单题
  2. 两种解法:1:左闭右闭区间 2.左闭右开区间

方法(1)左闭右闭

    public int search(int[] nums, int target) {

    //方法一:左闭右闭的区间
        int left =0;
        int right = nums.length- 1;
        int middle;
        
        while(left <= right)
        {
            middle = (right+left)/2;
            
            if(nums[middle] == target){
                return middle;
            }
            if(nums[middle] < target){
                left = middle + 1;

            }
            else{
                right = middle -1;
            }
        }

        return -1;

方法(2)左闭右开

class Solution {
    public int search(int[] nums, int target) {

        //方法二 :左闭右开的区间
        
        int  left = 0;
        int right = nums.length;
        int middle;
        while(left < right){
            middle  = (left + right) /2;


            if(nums[middle] == target){
                return middle;
            }
            if(nums[middle] > target){
                right = middle;
            }
            else{
                left = middle + 1;
            }
            
        }
        return -1;

    }
}

总结:两张方法的区别
类似的题:力扣第35题
题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。

思想:本题明确要求使用二分法查找。由于二分法中,索引表示的就是分解的位置。最终的结局两个情况
1.查到了target,一定是middle索引
2.没有查到target,那么最终也是找到了target的边界值。left索引就是需要插入的下一个位置。
我用的是左闭右闭方法:

class Solution {
    public int searchInsert(int[] nums, int target) {
        //这个就是二分法的题
        int left = 0;
        int right = nums.length - 1;  //左闭右闭区间
         int middle;
        while (left <= right){
            middle = (left +right) /2;

            if(nums[middle] ==target){
                return middle;
            }
            if(nums[middle] > target){
                right = middle - 1;
            }
            else{
                left = middle + 1;
            }
        }
        return left;
    }
}

我也想了下,如果使用左闭右开,left还是边界。

同样的还有力扣:34. 在排序数组中查找元素的第一个和最后一个位置(后续补上)

2.双指针方法

1.题目:力扣 27. 移除元素
思想:双指针,一快一慢,快的遍历数据,慢的就是记录数据。

class Solution {
    public int removeElement(int[] nums, int val) {
        //原地修改就是用覆盖的方法,双指针来操作
        int left = 0;
        int right;
        for(right = 0; right < nums.length ; right ++){
            if(nums[right] != val){
                nums[left] = nums[right]; 
                left++;
            }
        }
        return left;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值