第二天打卡
977.有序数组的平方
题目链接:https://leetcode.cn/classic/problems/squares-of-a-sorted-array/description/
实现思路:
这道算法需要时间复杂度为O(n)的方法来解决,也就是对数组进行至多一次的遍历。目前的实现思路只有暴力解法,也就是在对所有数组的数平方之后,然后再用快排排序,这是时间复杂度为O(nlongn)的解法,脑中还没有形成对双指针用法的概念
这里夏习了快排的思路,快排需要注意两个边界条件,一个是需要判断临界条件是否是这个基准值
具体实现代码
var sortedSquares = function (nums) {
for (let i = 0; i < nums.length; i = i + 1) {
nums[i] = nums[i] * nums[i]
}
return quickSort(nums)
};
function quickSort(arr) {
if (arr.length <= 1) {
return arr
}
let midIndex = Math.floor((arr.length / 2))
let mid = arr[midIndex]
let left = []
let right = []
for (let i = 0; i < arr.length; i = i + 1) {
if (midIndex === i) continue;
if (arr[i] < mid) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return [...quickSort(left), mid, ...quickSort(right)]
}
卡哥实现思路:
为什么会想到双指针的做法。因为有序数组最大值一定会在两边,由大到小的顺序肯定是由两边向中间靠拢的。这个循环的终止条件是i < =j,需要去判断两边的大小,然后放入新的数组里,因为两边一定有最大的,所以要先判断出最大的然后放入数组的最后;这个算法的时间复杂度是O(n)
此处注意点: 循环的点(left <= right), 因为如果不取=,会遗漏一个数,还有判断左指针对应的平方是小于右指针的平方的时候,则将右指针对应的平方放到新数组最后一位,右指针向前移动一位;
实现代码:
var sortedSquares = function(nums) {
let left = 0, right = nums.length - 1
let k = nums.length - 1, result = [];
while(left <= right) {
const leftMutiple = nums[left] * nums[left]
const rightMutiple = nums[right] * nums[right]
if(leftMutiple < rightMutiple) {
result[k] = rightMutiple
k = k - 1
right = right - 1
} else {
result[k] = leftMutiple
k = k - 1
left = left + 1
}
}
return result
};
209.长度最小的子数组
题目链接:. - 力扣(LeetCode)
我的思路:采用一前一后两个指针的方式,滑动右指针,并且记录当前两数及两数之间和的大小,当这个和大于target的时候,去移动左指针,并计算更新的和,当这个和小于 target 时,再移动右指针,思路上和卡哥大差不差,实现上因为练习稍少,稍微遇到点问题;
卡哥思路:
首先不断的去移动右指针(for循环) ,当和大于 target时,首先计算当前子矩阵的长度的最小值, 然后减去当前 left位置的数值计算和,并将 left + 1, 在 while 循环里去判断;
具体实现代码:
var minSubArrayLen = function (target, nums) {
let left = 0, sum = 0, arrayLength = Number.MAX_SAFE_INTEGER;
for(let right = 0; right < nums.length; right = right + 1) {
sum = sum + nums[right]
while (sum >= target) {
arrayLength = Math.min(right - left + 1, arrayLength)
sum = sum - nums[left]
left = left + 1
}
}
return arrayLength === Number.MAX_SAFE_INTEGER ? 0 : arrayLength
};
59. 螺旋矩阵 II
题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
我的思路: 定义 n * n的矩阵,在四个方向上依次遍历, 这个做过一遍,但是有些忘了,思路依然有些混乱