Leetcode打卡第二天

977. Squares of a Sorted Array
https://leetcode.com/problems/squares-of-a-sorted-array/description/

在脑子里出现的第一个想法便是暴力解,由于数组长度大于等于1,本题不用判断数组为空的情况。

思路:

1. 先遍历一遍数组将每个数值变成它的平方

2. 接着再排序

复杂度:

时间:O(nlogn)

空间:O(1)

改进:

为了降低时间复杂度,应该运用相向双指针。

难点:

在这题,我犯了两个错误:

        第一,我并没有意识到要先建立一个同样长度的数组去存储元素。

        第二,结束相向双指针的循环条件应该是left <= right。

思路:

1. 建立一个相同长度的新数组。

2. 设置左右指针和一个和数组长度一样的counter。

3. 当left <= right时,计算nums[left]的平方和nums[right]的平方,并做对比。如果nums[right]的平方大于nums[left]的平方,则nums[counter] = nums[right]的平方, right指针指向前一个index。反之nums[counter] = nums[left]的平方, left指针指向后一个index。

4. counter --

复杂度:

时间:O(n)

空间:O(n)

209. Minimum Size Subarray Sum
https://leetcode.com/problems/minimum-size-subarray-sum/description/

看到题目第一眼,心里大概知道是要用到滑动窗口,也就是说类似一个同向双指针。由于数组长度大于等于1,本题不用判断数组为空的情况。

难点:

我认为这题的难点是如何定义缩小窗口的条件。由于题目要求的是子序列的和要大于或者等于target,因此条件为sum >= target。

思路:

1. 设立左右两个指针,和一个res作为最后的返回值

2. 当右指针小于数组长度进入循环。

3. 每次循环的时候,都需要累加右指针的数值,并且子序列长度加一。

4. 当累加值大于等于target,要先通过比较,记录最小的长度。然后向右移动做左指针,缩窄窗口,同时子序列长度减一。

5. 如果res没有改变则返回0,否则返回res。

复杂度:

时间:O(n)

空间:O(1)

59. Spiral Matrix II
https://leetcode.com/problems/spiral-matrix-ii/

这题其实不算难,只要弄清楚矩阵的位置就很容易做出来。

思路:

1. 设置一个n*n的矩阵grid

2. 设置top,bottom,left,right作为限制。

3. 设置一个counter循环从1到n^2

3. 从grid的[top][left]出发到[top][right]

4.从grid的[top][right]出发到[bottom][right]

5. 从grid的[bottom][right]出发到[bottom][left]

6. 从grid的[bottom][left]出发到[top][left]

每次遍历完一个row或者column都要相对应的加一或者减一,防止重复写入

复杂度:

时间:O(n)

空间:O(n^2)

数组总结:

在数组的应用中,一般可以分为三大类。

        第一类是运用二分法解决问题,用二分法的前提是数组是一个有序的数组。基本可以套用模版解决。

        第二类是双指针问题。双指针分为同向,相向双指针。快慢指针,滑动窗口的逻辑其实就是同向双指针的运用。相向双指针的例子就是977,相向双指针要注意的点:循环条件是left <= right。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值