欢迎光临
我们一直在努力

代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、977.有序数组的平方

数组理论基础文章:代码随想录数组基础理论

 704. 二分查找

思路:最基础的而二分查找算法,对新手来说最大的难点在于处理好边界条件,在看代码随想录讲解视频前一头雾水,看完瞬间理解了写二分查找的两种主要方法。

方法一:左闭右闭区间

两个要点:

1.此时包含left和right的区间所有数都是target的可能值,是一个闭区间,所以while语句应写为

while(left<=right)

2.更新mid时,由于nums[mid]在我们搜索的区间之内,所以范围缩小之后不用再检索mid下标对应的数,写为

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

方法二:左闭右开区间

同样是两个要点,此时left不能等于right,因为有边界是开区间,所以应写为

while(left<right)

同理在更新右边界时将有边界直接更新为mid,由于是开区间,新一轮搜索不会再次查找nums[mid]。

27. 移除元素

思路:最好像的办法是暴力算法,每次遇到val的数组元素就将该元素后的所有元素往前移一位,写两个for循环,时间复杂度为O(n^{2}),但这样对于更大的范围会超时,效率也不高,最好的办法是用双指针法覆盖。由于删除后的数组长度一定小于等于原数组长度,所以我们可以直接在原数组用两个指针来操作。

int removeElement(int* nums, int numsSize, int val) {
int j=0;
for(int i=0;i<numsSize;i++)
{
if(nums[i]!=val)
{
nums[j++]=nums[i];
}
}
return j;
}

其中,i是待处理的数组元素下标,j是新数组的下标,i每一轮都会前进一位,但j下标只有当数组元素不是待删除的元素才会更新。

977.有序数组的平方

思路:这题最大难点在于怎么排序负数与正数平方后的大小,我用c语言写连暴力算法都没想到,因为不熟悉c语言中qsort函数使用,也不会写比较函数传进去。但本题最优算法依旧是双指针,一个指针从最左端开始,一个指针从最右端开始,比较两指针对应元素平方后大小,从后往前填充数组,与上题不同的是此时需要另外有一个idx来作为处理后数组的索引,每填充一个减一。

注意:用C语言写时返回的数组一定要申请内存!!!

int *res =(int*)malloc(numsSize*sizeof(int));

我写的代码如下:

int* sortedSquares(int* nums, int numsSize, int* returnSize) {
*returnSize=numsSize;
int *res =(int*)malloc(numsSize*sizeof(int));
int left=0,right=numsSize-1;
int idx=numsSize-1;
while(left<=right){
int leftsq=nums[left]*nums[left];
int rightsq=nums[right]*nums[right];
if(leftsq>rightsq)
{
res[idx–]=leftsq;
left++;
}
else{
res[idx–]=rightsq;
right–;
}
}
return res;
}

今日总结

今天是算法训练营开营第一天,这几道题之前都写过一遍了重温了一下,题目难度不大,但是这是我第一次写博客来记录自己的刷题所思所想,希望在接下来的两个月可以跟上节奏,坚持写博客,提升自己的代码能力!

赞(0)
未经允许不得转载:171主机测评 » 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、977.有序数组的平方
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址