209.长度最小的子数组
题目:209. 长度最小的子数组 - 力扣(LeetCode)
状态:最小为一个元素的情形没考虑到,导致卡了一段时间
扩展题目:
(注意map的getOrDefault(nums[i], 0)函数,put函数可以直接覆盖原先的值)
思路
关键条件:子数组
注意:要分清边界条件,right=0还是1,sum=0还是nums[0]
代码
时间复杂度:O(n) 空间复杂度:O(1)
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum = 0;
int ans = Integer.MAX_VALUE;
int l = 0, r = 0;
while(r < nums.length){
sum += nums[r];
while(sum >= target){
ans = Math.min(r - l + 1, ans);
sum-=nums[l];
l++;
}
r++;
}
return ans == Integer.MAX_VALUE ? 0 : ans;
}
}
59. 螺旋矩阵 II
状态:单数情况要考虑将中间值补全
扩展题目: 54. 螺旋矩阵
要考虑清楚怎么模拟的,和螺旋矩阵模板一致时,还要考虑内层循环终止条件,不如改成四边界的情况
思路
注意:要注意圈数记录
代码
时间复杂度:O(n^2) 空间复杂度:O(n)
螺旋矩阵,方阵
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int loop = 1, cur = 1;
List<Integer> ans = new ArrayList<>();
int m = matrix.length;
int n = matrix[0].length;
while(cur < m * n){
int i = loop - 1, j = loop - 1;
while(j < n - loop && cur <= m*n){
ans.add(matrix[i][j]);
j++;
cur++;
}
while(i < m - loop && cur <= m*n){
ans.add(matrix[i][j]);
i++;
cur++;
}
while(j > loop - 1 && cur <= m*n){
ans.add(matrix[i][j]);
j--;
cur++;
}
while(i > loop - 1 && cur <= m*n){
ans.add(matrix[i][j]);
i--;
cur++;
}
loop++;
}
if(m == n && m % 2 == 1) ans.add(matrix[m / 2][n / 2]);
return ans;
}
}
螺旋矩阵,矩阵
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1;
List<Integer> res = new ArrayList<>();
while(true){
for(int i = l; i <= r; i++) res.add(matrix[t][i]);
if(++t > b) break;
for(int i = t; i <= b; i++) res.add(matrix[i][r]);
if(--r < l) break;
for(int i = r; i >= l; i--) res.add(matrix[b][i]);
if(--b < t) break;
for(int i = b; i >= t; i--) res.add(matrix[i][l]);
if(++l > r) break;
}
return res;
}
}
58. 区间和
题目:58. 区间和(第九期模拟笔试) (kamacoder.com)
题解:58. 区间和 | 代码随想录 (programmercarl.com)
状态:
思路
关键条件:区间内元素总和
注意:注意前缀和数组第一位补0
代码
时间复杂度:O(n) 空间复杂度:O(n)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] vec = new int[n];
int[] p = new int[n];
int presum = 0;
for (int i = 0; i < n; i++) {
vec[i] = scanner.nextInt();
presum += vec[i];
p[i] = presum;
}
while (scanner.hasNextInt()) {
int a = scanner.nextInt();
int b = scanner.nextInt();
int sum;
if (a == 0) {
sum = p[b];
} else {
sum = p[b] - p[a - 1];
}
System.out.println(sum);
}
scanner.close();
}
}