文档讲解:代码随想录
状态:有点难度,但不多
977.有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
- 输入:nums = [-4,-1,0,3,10]
- 输出:[0,1,9,16,100]
- 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]
示例 2:
- 输入:nums = [-7,-3,2,3,11]
- 输出:[4,9,9,49,121]
视频《代码随想录》算法视频公开课 (opens new window):双指针法经典题目!LeetCode:977.有序数组的平方
思路:双指针法
暴力解法为所有的数平方再排序;而通过双指针法可以简化
以下为原理:
可以设置两个指针,一个在开头,一个在末尾。(默认已经排序)那么数字平方后最大的数一定是开头数字或末尾数字的平方,故可以将这两个数字的平方进行比较,大的一个则放在末尾(为非递减顺序 排序)并且该指针加一,在进行下一次比较;直到重合。
代码如下
class Solution {
public int[] sortedSquares(int[] nums) {
int left=0;
int right=nums.length-1;
int[] result=new int[nums.length];
int j=nums.length-1;
while(left<=right){
if(nums[left] * nums[left] > nums[right] * nums[right]){
result[j]=nums[left]*nums[left];
left++;
j--;
}
else{
result[j]=nums[right]*nums[right];
right--;
j--;
}
}
return result;
}
}
209.长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
- 输入:s = 7, nums = [2,3,1,2,4,3]
- 输出:2
- 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
提示:
- 1 <= target <= 10^9
- 1 <= nums.length <= 10^5
- 1 <= nums[i] <= 10^5
视频:
《代码随想录》算法视频公开课 (opens new window):拿下滑动窗口! | LeetCode 209 长度最小的子数组
思路1:暴力解法
补充:Math.min(value1,value2...valueN) :返回参数中最小的值
Integer.MAX_VALUE 是 Java 中的一个常量,它表示整数数据类型 int 的最大可表示值
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int resurt = Integer.MAX_VALUE;
for(int i=0;i<nums.length;i++){
int sum=0;
for(int j=i;j<nums.length;j++){
sum=sum+nums[j];
if(sum>=target){
resurt=Math.min(resurt,j-i+1);
//Math.min(value1,value2...valueN) :返回参数中最小的值
break;
}
}
}
return resurt == Integer.MAX_VALUE ? 0 : resurt;
}
}
但该方法可能超过运行时间
如图:
思路2:滑动窗口
类似暴力解法,但通过一个慢指针一个快指针可以减少执行次数,当第一次获得大于等于目标的数组时,记录该数组并去除第一个,再加后面的数字就可以减少运行的次数。进而减少运行时间。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int slow = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
for (int flast = 0; flast < nums.length; flast++) {
sum += nums[flast];
while (sum >= target) {
result = Math.min(result, flast - slow + 1);
sum -= nums[slow++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
欢迎各位大佬指正。