【leetcode 日记 | DAY2】 螺旋矩阵 | 滑动窗口| 整数如何逆置

螺旋矩阵

题目

leetcode | 59. 螺旋矩阵 II

问题分析

模拟循环过程:

  • 上边从左至右、右边从上至下、下边从右至左、左边从下至上,为一圈,规模n时转 n/2 圈

  • 处理边角元素:一圈内遍历四条边,遵循区间不变原则,保证左闭右开

代码

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0));
        int loop = n / 2; int flag = n % 2; int k = n - 1;
        int num = 1; cout<<flag;
        for(int i = 0; i < loop; i++) {
            for(int j = i; j < k - i; j++) {//前闭后开
                res[i][j] = num++; 
            }
            for(int j = i; j < k - i; j++) {
                res[j][n - 1 - i] = num++; 
            }
            for(int j = k - i; j > i; j--) {
                res[n - 1 - i][j] = num++;
            }
            for(int j = k - i; j > i; j--) {
                res[j][i] = num++;
            }
        }
        if(flag == 1) res[n/2][n/2] = num++;
        return res;

    }
};

滑动窗口

题目

leetcode | 209. 长度最小的子数组

问题分析

【代码随想录】数组 | 滑动窗口

  • 暴力解法:设定起始位置 i,终止位置 j,固定开端,移动结尾。

  • 滑动窗口:设置终止位置,移动起始位置

  • 移动时机:区间内已满足/不满足条件时。例如:209题中,区间已满足和条件时可移动,找最小长度;904题中水果种类超出时要移动,保证满足篮子数量限制。

代码

209.长度最小的子数组

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int length = nums.size(); int sum = 0; 
        int flag = 0;//整个数组加起来不满足条件
        int i, j = 0;
        for(i = 0; i < nums.size(); i++) {
            sum += nums[i];
            while(sum >= target) {
                flag = 1;
                length = length > (i - j + 1)? (i - j + 1): length;
                sum -= nums[j++]; //判断移动后是否还满足条件
            }
        }
        if(flag == 0) return 0;
        return length;

    }
};

904. 水果成篮

  • 注意一下如何记录【种类】,以及如何判断某类已全部移出(数量记录)

//用哈希表记录<种类,数量>
class Solution {
public:
    int totalFruit(vector<int>& fr) {
        int i = 0, j = 0;
        int cnt = 0; int res = 0;
        unordered_map<int,int> basket; //篮子编号,水果数量

        for(int i = 0; i < fr.size(); i++) {   
            if(basket[fr[i]] == 0) //第一次出现
                cnt++;
            basket[fr[i]]++;
            //cout<<cnt<<endl; 
            while(cnt > 2) {
                basket[fr[j]]--;
                if(basket[fr[j]] == 0)cnt--;
                j++;
            }
            res = res > (i - j + 1)? res: (i - j + 1);
        }
        return res;
    }
};
//用数组记录,下标为种类,值为数量
class Solution {
public:
    int totalFruit(vector<int>& fr) {
        int i = 0, j = 0;
        int cnt = 0; int res = 0;
        vector<int> frNums(fr.size()+10,0);

        for(i = 0; i < fr.size(); i++) {
            if(frNums[fr[i]] == 0) cnt++;
            frNums[fr[i]]++;
            while(cnt > 2) {
                frNums[fr[j]]--;
                if(frNums[fr[j]] == 0) cnt--;
                j++;
            }
            res = res > (i - j + 1)? res: (i - j + 1);
        }
        return res;
    }
};

整数逆置的方法

题目

leetcode | 9. 回文数

代码

class Solution {
public:
    bool isPalindrome(int x) {
        if(x < 0) return false;
        if(x == 0) return true;

        int a = x;
        long b = 0;
        while(a) {
            b = a % 10 + b * 10;
            a /= 10;
        }       
        return b == x;
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值