欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 代码随想录算法训练营第一天 | 704二分查找 27.移除元素 977.有序数组的平方

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

2025/6/25 23:17:04 来源:https://blog.csdn.net/kkksij/article/details/143093409  浏览:    关键词:代码随想录算法训练营第一天 | 704二分查找 27.移除元素 977.有序数组的平方

704:二分查找:

题目链接:. - 力扣(LeetCode)

文章讲解:代码随想录

视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili

思路:题目中得知有序数组且数组中的元素不重复,寻找整形target对应的下标,直接使用二分查找。

具体实现:

定义并找到最左和最右下标,假设target位于左闭右闭区间[left,right],

通过while循环left<=right ,(此时left == right有意义),每次循环求得中间值mid,比较mid位置的数组与target的大小,nums[mid]>target,说明target在mid的左侧,right = mid-1; 若nums[mid]<terget, target在mid右侧,left = mid+1; 若等于,直接返回mid.

循环结束后还没找到,说明不存在,直接返回-1.

class Solution {public int search(int[] nums, int target) {int left = 0;int right =  nums.length-1;while(left<=right){int mid = (left+right)/2;if(nums[mid]>target){right = mid-1;}else if(nums[mid]<target){left= mid+1;}else{return mid;}}return -1;}
}

对于二分法有两种实现方法,左闭右闭( [left,right] )和左闭右开(  [left,right)  ),两者的区别是

左闭右开:

1. while循环使用 left< right (当left == right时 在区间 [left,right)之中没有意义,是无效空间      )

2.当nums[mid] > target,说明target在左区间([left,mid) 中),此时right = mid;

当nums[mid] < target,说明target在右区间([mid+1,right) 中) ,此时left = mid+1;

具体代码如下:

class Solution {public int search(int[] nums, int target) {int left = 0;int right =  nums.length-1;while(left<right){int mid = (left +right)/2;if(nums[mid]< target){ //target位于mid右侧left = mid+1;}else if(nums[mid]>target){ //target位于mid左侧right = mid;}    else{return mid;     }}return -1;}
}

27.移除元素:

题目链接:. - 力扣(LeetCode)

文章讲解:代码随想录

视频讲解:数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili

注:使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要

思路快慢指针法:

通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

快指针(fastindex):寻找新数组的元素,即不含目标元素。

慢指针(slowindex):更新新数组下标的位置

创建两个变量  fastindex和 slowindex, 通过for fastindex循环,若nums[ fastindex] != val,将nums[slowindex] = nums[fastindex], 同时将slowindex自增.

若nums[fastindex] == val,直接跳过进入下一次for循环,此时fastindex值增1,而slowindex的值不变.

最后返回slowindex即为!=val的元素数量。

具体思路如下:

具体代码如下:

class Solution {public int removeElement(int[] nums, int val) {int slowindex = 0;for(int fastindex =0;fastindex<nums.length;fastindex++){if(nums[fastindex] != val){nums[slowindex] = nums[fastindex];slowindex++;}}return slowindex;
}
}

977. 有序数组的平方:

题目链接:. - 力扣(LeetCode)

文章讲解:代码随想录

视频讲解:

双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili

思路:1.暴力解法:通过for循环将数组所有元素平方,之后通过冒泡排序排列即可

class Solution {public int[] sortedSquares(int[] nums) {//先将所有数组平方for(int i =0;i<nums.length;i++){nums[i] = nums[i]*nums[i];}//冒泡排序排列for(int i=0;i<nums.length-1;i++){for(int j=0;j<nums.length-i-1;j++){if(nums[j]>nums[j+1]){int num1 = nums[j];nums[j] = nums[j+1];nums[j+1] = num1;}}}
return nums;}

2.双指针法:定义一个和原数组A大小(k)一样的新数组result,

再定义2个整形i 和 j, i指向初始位置,j指向末尾。

当A[i] * A[i] > A[j] * A[j] ,则将 result[k--] = A[i] * A[i];

当 A[i] * A[i] <= A[j] * A[j] 则将 result[k--] = A[j]*A[j];

具体代码如下:

class Solution {public int[] sortedSquares(int[] nums) {int i = 0;int j = nums.length-1;int[] result = new int[nums.length];int index = nums.length-1;while(i<=j){if(nums[i]* nums[i]> nums[j]* nums[j]){result[index--]  = nums[i]*nums[i];i++;}else{result[index--] = nums[j] * nums[j];j--;}}return result;}}

喜欢的老铁来个三联吧!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词