977.有序数组的平方
左右指针法
平方(遍历数组O(n)) 再排序(O(nlogn)) 复杂度有O(nlogn),为了达到O(n)的复杂度,我们观察数组发现非递减数列平方后最大值肯定出在数列两侧,所以我们可以用左右指针法,比较左右指针的大小,分别向中间靠拢。
def sortedSquares(self, nums):
n =len(nums)
left = 0
right = n - 1
ans = [-1]* n
i = n - 1
while(left <= right):
ll = nums[left] **2
rr = nums[right] **2
if ll>=rr:
ans[i] = ll
left +=1
else:
ans[i] = rr
right -= 1
i -= 1
return ans
209.长度最小的子数组
滑动窗口
一个O(N)的for循环,其中遍历的是滑动窗口的终止位置。当窗口长度达到target时,用while循环不断增加窗口的起始位置来缩短窗口。
public int minSubArrayLen(int target, int[] nums) {
int n = nums.length;
int i = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
for(int j = 0; j<n; j++){
sum += nums[j];
while (sum >=target) {
result = Math.min(result,j-i+1);
sum -= nums[i++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
59.螺旋矩阵II
转晕了。。。先确定转几圈(loop),如果n是奇数,最后要把最中间的值填上。
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
int count = 1;
int start = 0;
int i, j;
for (int loop = 1; loop <= n/2; loop++){
for (j = start; j < n - loop; j++) {
res[start][j] = count++;
}
for (i = start; i < n - loop; i++) {
res[i][j] = count++;
}
for (; j >= loop; j--) {
res[i][j] = count++;
}
for (; i >= loop; i--) {
res[i][j] = count++;
}
start++;
}
if (n % 2 == 1) {
res[start][start] = count;
}
return res;
}