代码随想录算法训练营第二天977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

第二天打卡

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的矩阵,在四个方向上依次遍历, 这个做过一遍,但是有些忘了,思路依然有些混乱

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值