我是新手!!!
再做题之前,你要明白力扣上是自动帮你输入值,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值,为新的数组长度。
注意看题 你不需要考虑数组中超出新长度后面的元素。
以上来自代码随想录训练营练习。