1. LeetCode977 有序数组的平方
题目
思路
暴力解题:
for循环一遍数组,求出每个index对应的平方值,然后用Array.sort()函数将数组排序,返回排序后的数组。
缺点:sort函数的时间复杂度高,力扣上显示用时5ms,而下一个方法时间复杂度为O(n),用时只耗费了1ms
双指针法:
因为原数组为非降序数组,决定了平方后,数字大的一定集中在两头,数字小的集中在中间。所以分别用两个指针指向原数组的头和尾,比较头平方和尾平方。再定义一个新数组,用一个指针指向新数组的尾,上述二者中大的值插入到新数组的尾部。
代码
双指针:
class Solution {
public int[] sortedSquares(int[] nums) {
int[] newNums = new int[nums.length];
for (int i = 0, j = nums.length-1, k = nums.length-1; k >= 0; ){
if (nums[i]*nums[i] <= nums[j]*nums[j]){
newNums[k] = nums[j]*nums[j];
j--;
}else {
newNums[k] = nums[i]*nums[i];
i++;
}
k--;
}
return newNums;
}
}
暴力:
class Solution {
public int[] sortedSquares(int[] nums) {
for (int i = 0; i < nums.length; i++){
nums[i] = nums[i] * nums[i];
}
Arrays.sort(nums);
return nums;
}
}
2. LeetCode209 长度最小的数组
题目
思路
暴力法:
外层循环遍历数组所有元素,内存循环找到外层循环定位到某个元素的前提下,其最小连续子数组
双指针法:
讲解链接:
用到了滑动窗口的思想,for循环定义窗口右指针遍历数组所有元素,在每次遍历内部,又定义了窗口左指针,结合while,寻找最小长度。
代码
双指针法
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum = 0;
int left = 0;
int length = 0;
int min = Integer.MAX_VALUE;
for(int j= 0; j < nums.length; j++){
sum += nums[j];
while (sum >= target){
length = j - left + 1;
min = length < min ? length : min;
sum -= nums[left];
left++;
}
}
min = min == Integer.MAX_VALUE ? 0 : min;
return min;
}
}
Integer.MAX_VALUE
定义最大值
倒数第二行很重要,属于临界特殊情况处理。即如果都遍历一遍了,sum还是小于target,那说明找不到符合要求的字符串最小长度,则要特殊处理了。