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;}}
喜欢的老铁来个三联吧!