代码随想录算法训练营第二天| 209. 长度最小的数组,59.螺旋矩阵II,开发商购买土地

37 阅读3分钟

🔗 题目链接

LeetCode 209.长度最小的子数组

📖 考察点

双指针

📖 题意理解

入参:正整数数组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 }
}

⏱️ 复杂度分析

📚 总结与反思

关注判断条件,条件错了结果就不对


🔗 题目链接

LeetCode 59.螺旋矩阵II

📖 考察点

模拟

📖 题意理解

入参:正整数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
}

⏱️ 复杂度分析

📚 总结与反思

学习了前缀和的应用 前缀和 在涉及计算区间和的问题时非常有用