🔗 题目链接
📖 考察点
双指针
📖 题意理解
入参:正整数数组nums 目标target 出参:满足综合大于target的长度的子数组的长度
💡 解题思路
1.枚举所有情况找出最小值 2.双指针
思路一:
思路二:
🔑 关键点总结
双指针,左指针 left在满足条件时右移,右指针i,随着便历右移。
💻 代码实现
JavaScript
var minSubArrayLen = function(target, nums) {
let left = 0;
let minLen = nums.length+1;
let sum = 0;
for(let i = 0;i<nums.length;i++){
sum+=nums[i];
while(sum >= target){
sum -= nums[left];
minLen = Math.min(minLen,i-left+1);
left++;
}
}
return minLen === nums.length+1?0:minLen;
};
Rust
pub fn min_sub_array_len(target: i32, nums: Vec<i32>) -> i32 {
let n = nums.len();
let mut left = 0;
let mut min_len = n + 1;
let mut sum = 0;
for i in 0..n {
sum += nums[i];
while sum >= target {
sum -= nums[left];
min_len = min_len.min(i - left + 1);
left += 1;
}
}
if min_len == n + 1 { 0 } else { min_len as i32 }
}
⏱️ 复杂度分析
📚 总结与反思
关注判断条件,条件错了结果就不对
🔗 题目链接
📖 考察点
模拟
📖 题意理解
入参:正整数n; 出参:n*n的数组,元素按顺时针排列
💡 解题思路
1.枚举所有情况找出最小值 2.双指针
思路一:
模拟
🔑 关键点总结
便历中的条件要搞清楚 便历中的变量和不变量要分清
💻 代码实现
JavaScript
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
let startX = 0;
let startY = 0;
let mid = ~~(n/2);
let loop = ~~(n/2);
let offset = 1;
let count = 1;
let res = new Array(n).fill(0).map(()=>new Array(n).fill(0));
while(loop --){
let col = startX;
let row = startY;
for(;col<n-offset;col++){
res[row][col] = count++;
}
for(;row<n-offset;row++){
res[row][col] = count++;
}
for(;col>startX;col--){
res[row][col] = count++;
}
for(;row>startY;row--){
res[row][col] = count++;
}
startX++;
startY++;
offset++;
}
if(n%2!==0){
res[mid][mid] = count;
}
return res;
};
Rust
pub fn generate_matrix(n: i32) -> Vec<Vec<i32>> {
let mut start_x = 0;
let mut start_y = 0;
let mut loop_count = n / 2;
let mid = n / 2;
let mut offset = 1;
let mut count: i32 = 1;
let mut res = vec![vec![0; n as usize]; n as usize];
while loop_count != 0 {
let mut col = start_x;
let mut row = start_y;
while col < n - offset {
res[row][col as usize] = count;
count += 1;
col += 1;
}
while (row as i32) < n - offset {
res[row][col as usize] = count;
count += 1;
row += 1;
}
while col > start_x {
res[row][col as usize] = count;
count += 1;
col -= 1;
}
while row > start_y {
res[row][col as usize] = count;
count += 1;
row -= 1
}
loop_count -= 1;
start_x += 1;
start_y += 1;
offset += 1;
}
if n % 2 == 1 {
res[mid as usize][mid as usize] = count;
}
res
}
⏱️ 复杂度分析
📚 总结与反思
rust的类型转换是不是太复杂了。。。
🔗 题目链接
📖 考察点
前缀和
📖 题意理解
入参:nums n* m 的数组 出参:横竖切一刀,找到最小的差值
💡 解题思路
前缀和
思路一:暴力循环
把所有的情况算一遍,求其差值,记录最小值
思路一:前缀和
🔑 关键点总结
💻 代码实现
JavaScript
/**
* @param {number} n
* @return {number[][]}
*/
function func(nums) {
let n = nums.length;
let m = nums[0].length;
let c = new Array(n).fill(0);
let r = new Array(m).fill(0);
let sum = 0;
let min = Infinity;
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
c[i] += nums[i][j];
r[j] += nums[i][j];
sum += nums[i][j];
}
}
let sum1 = 0;
let sum2 = 0;
for (let i = 0; i < n; i++) {
sum1 += c[i];
min = min < Math.abs(sum - 2 * sum1) ? min : Math.abs(sum - 2 * sum1);
}
for (let j = 0; j < m; j++) {
sum2 += r[j];
min = min < Math.abs(sum - 2 * sum2) ? min : Math.abs(sum - 2 * sum2);
}
}
Rust
fn func(nums: Vec<Vec<i32>>) -> i32 {
let n = nums.len();
if n == 0 {
return 0;
}
let m = nums[0].len();
let mut c = vec![0; n];
let mut r = vec![0; m];
let mut sum = 0;
for i in 0..n {
for j in 0..m {
c[i] += nums[i][j];
r[j] += nums[i][j];
sum += nums[i][j];
}
}
let mut min = i32::MAX;
let mut sum1 = 0;
for i in 0..n {
sum1 += c[i];
let current = (sum - 2 * sum1).abs();
if current < min {
min = current;
}
}
let mut sum2 = 0;
for j in 0..m {
sum2 += r[j];
let current = (sum - 2 * sum2).abs();
if current < min {
min = current
}
}
min
}
⏱️ 复杂度分析
📚 总结与反思
学习了前缀和的应用 前缀和 在涉及计算区间和的问题时非常有用