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。