Day1.大一新手跟做704,27leetcode,纯纯学习。(最简单的二分题)

我是新手!!!
再做题之前,你要明白力扣上是自动帮你输入值,so你只需要打出你的输出代码即可(个人理解到这里,毕竟菜,而且是小白
以下是有序数组的二分,比较简单可用for,但是数据大时wa掉

以下是有序数组的二分,比较简单可用for,但是数据大时wa掉。
区间双闭如下。

class Solution {
public:
    int search(vector<int>& nums, int target) {
 (我打的代码从这里开始)    int left=0;
     					 int right=nums.size()-1;
						 while (left<=right){
       					 int mid=(left+right)/2; //这里有大佬提出 left + (right - left) / 2 妙啊!!!
	    				 if(nums[mid]<target) left=mid+1;
						 else if(nums[mid]>target) right=mid-1;
						 else if(nums[mid]==target) return mid;
}
   						 return -1;
    }
    (这里结束)
};

简单来说,当left等于15亿,rigth等于18亿的时候,left+right超int上限了,而使用left + (right - left) / 2不会超
left+right=33亿 > int上限值,已经超上限值了,除2就没意义了,而用left 加 right-left差值这种形式就相当于15亿加3亿,结果才18亿,没有超,所以可以得到正确结果

nums = [-1,0,3,5,9,12], target = 9

首先定义下标 left=0,right=数组长度-1;
ok不用说一会的 中值下标=(left +right)/2; (要把一个数组二分啦)!!

这里可以带入几个数据试一下中值下表对不对;
直接说 if循环;

如果中值下标的数大于target,说明顺序: target … 中值
让right值为mid-1,缩小趋范围check;
第二次循环:mid=新区间的中值,接着上一步的步骤,继续循环,直到找到下表值为target的数,输出下标为止。
(中值下标的数小于target,left=mid+1,此时right不动)//一直二分罢了。
如果不太理解可以在纸上画画,实验下,感受下。
27
代码如下

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slow=0;
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]!=val)
            {
                nums[slow]=nums[i];
                slow++;
            }
        }
        return slow;

    }
};
代码如下
			 int slow=0;
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]!=val)
            {
                nums[slow]=nums[i];
                slow++;
            }
        }
        return slow;

定义一个slow作下标
当数组中的数 不等于 val(目标值)
ok,这是我们要的数,接下来

nums[slow]=nums[i];
让后slow++,到下一个下标,准备存值。

但是如果是目标值=数组中的值,好,不替换。
整个循环后
输出slow值,为新的数组长度。

注意看题 你不需要考虑数组中超出新长度后面的元素。

以上来自代码随想录训练营练习。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值