leetcode 977有序数组平方
非递减数组,平方升序排序
题目链接
2种双指针的方法
方法1:
- two pointer分别指向1头1尾;
- 往中间移动
方法2:
- 找到负数与正数的分界线
- 两个指针指向分界的2端
- 往两边移动
class Solution {
public int[] sortedSquares(int[] nums) {
int p = 0, q = nums.length - 1; //two pointers
int[] res = new int[nums.length]; //开辟新的数组空间
int i = q;
while (p <= q) {
if (Math.abs(nums[p]) > Math.abs(nums[q])) {
res[i--] = nums[p] * nums[p];
p++;
}
else {
res[i--] = nums[q] * nums[q];
q--;
}
}
return res;
}
}
leetcode 209
滑动窗口
- 窗口内:subarray中 all element和
- 移动 window 起始pointer:当窗口内sum>=target,就要移动
- 移动 window 的 end pointer:遍历数组用的
时间复杂度 O ( n ) O(n) O(n)
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int p = 0, q = 0;
int sum = 0, len = nums.length;
boolean flag = false;
while (q < nums.length) {
sum += nums[q];
while (sum >= target) {
flag = true;
int l = q - p + 1;
if (l < len)
len = l;
sum -= nums[p];
++p;
}
++q;
}
if (flag)
return len;
else
return 0;
}
}
leetcode59 螺旋矩阵II
tips:
( x − 1 , y ) ( x , y − 1 ) ( x , y ) ( x , y + 1 ) ( x + 1 , y ) \begin{matrix} & (x-1, y) & \\ \\ (x, y-1) & (x, y) & (x,y+1) \\\\ & (x+1, y) & \end{matrix} (x,y−1)(x−1,y)(x,y)(x+1,y)(x,y+1)
一个中心坐标的上下左右坐标,可以用偏移量表示 ( − 1 , 0 ) , ( 0 , 1 ) , ( 1 , 0 ) , ( 0 , − 1 ) (-1,0), (0,1), (1,0), (0,-1) (−1,0),(0,1),(1,0),(0,−1)
这样的话我们就可以用一个loop完成上下左右4个点的遍历
dx[] = {-1, 0, 1, 0};
dy[] = {0, 1, 0, -1};
for (i = 0; i < 4; ++i) {
a = x + dx[i];
b = y + dy[i]; //(a,b)就是对应坐标
}
class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
int[] dx = {-1, 0, 1, 0}, dy = {0, 1, 0, -1};
int x = 0, y = 0, d = 1;
for (int i = 1; i <= n * n; ++i ) {
res[x][y] = i;
int a = x + dx[d], b = y + dy[d];
if (a < 0 || a >= n || b < 0 || b >= n || res[a][b] > 0) {
d = (d + 1) % 4;
a = x + dx[d];
b = y + dy[d];
}
x = a;
y = b;
}
return res;
}
}