Leetcdoe-Day5-代码随想录-704-35

数组

  1. 二维数组在内存空间中是连续的,0x7ffee4065820 与 0x7ffee4065824 相差4个字节,因为一个int元素占4个字节。
  2. JAVA不暴露元素地址

二分查找

leetcode704
**题解:**简单二分法,需要注意的是,if结构中已经对nums[mid]==target的情况做出了判断,那么在对左右范围进行改变的时候就直接+1就好,否则会timeout。
**总结:**二分两种写法,一种是target在闭区间,此时while内部i=j是有意义的,左右范围都需要往前进一步,如下代码。第二种写法是左闭右开,此时while内不需要考虑i=j,且变化左侧区域时往前进一步即可。如果题目要求是问某个值在不在区间里,用左闭右闭区间(while l <= r),每个mid做大于、小于、等于三次判断,在等于时输出,循环结束未输出说明不在区间里;如果题目要求“找到第一个大于/小于x的下标”,用左闭右开区间(while l < r),每个mid做大于、小于等于两次判断,不在循环体里输出,循环结束返回l或r(l=r,不要返回mid),就是所求下标。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int i=0,j=nums.size()-1;
        while(j>=i){
            int mid=(i+j)/2;
            if(nums[mid]>target){
                j=mid-1;
            }
            else if(nums[mid]<target){
                i=mid+1;
            }
            else{
                return mid;
            }
        }
        return -1;
    }
};

在这里插入图片描述
leetcode35
**题解:**为什么最后return j+1呢?可能要仔细想想。循环不变量?

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int i=0,j=nums.size()-1;
        while(i<j){
            int mid=(i+j)/2;
            if(nums[mid]>target){
                j=mid-1;
            }
            else if(nums[mid]<target){
                i=mid+1;
            }
            else{
                return mid;
            }
        }
        return j+1;
    }
};

在这里插入图片描述
2024-04-07-22:45,实验室要关了,我什么时候才能发paper啊啊啊啊!!回宿舍!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值