代码随想录算法训练营第1天| 704. 二分查找、27. 移除元素、977.有序数组的平方
704 使用二分法的前提是数组元素本身是有序的,同时数组中还应无重复元素,因为一旦存在重复元素,使用二分法返回的数组下标可能不是唯一的。
二分法有两种写法,一种是左闭右闭,第二种是左闭右开。两种方法主要的区别主要是边界处理不同。
左闭右闭:[left,right],left = 0,right = size-1。while中的循环条件应该是left<=right,根据数组值大小与目标值大小情况,每次循环将目前的数组缩小到原来的一半。时间复杂度O(log2N)。 middle = left + (right - left) / 2。
左闭右开:[left,right),left = 0,right = size。因为数组元素下标从零开始,此时right的下标数是无效的。while循环的条件是left<right。左指针变化:left = middle+1;right = middle。middle = left + (right - left) / 2。
27 移除数组中的元素
方法一:(暴力解)
使用两个for循环即可,第一个循环用来遍历数组,第二个for循环用来移动后续元素。
点击查看代码
for(int i=0;i<numsSize;i++){
if(val==nums[i]){
for(int j=i;j<numsSize-1;j++){
nums[j]=nums[j+1];
}
i--;
numsSize=numsSize-1;
}
}
点击查看代码
int slow=0,n = numsSize;
for(int fast=0;fast<n;fast++){
if(nums[fast]!=val){
nums[slow++] = nums[fast];
}
}
return slow;
}
点击查看代码
int p=0;
int q=numsSize-1;
*returnSize = numsSize;
int *ans = (int *)malloc(sizeof(int)*numsSize);
for(int index = numsSize-1;index>=0;index--){
int lval = nums[p]*nums[p];
int rval = nums[q]*nums[q];
if(lval>=rval){
ans[index] = lval;
p++;
}else{
ans[index] = rval;
q--;
}
}
return ans;
浙公网安备 33010602011771号