从零开始的刷LeetCode生活 第3期 31-40

在这里插入图片描述

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        for(int i = nums.size() - 1; i; i --)
        {
            if(nums[i - 1] < nums[i])
            {
                int j = i;
                while(j + 1 < nums.size() && nums[j + 1] > nums[i - 1]) j++;
                swap(nums[i - 1], nums[j]);
                reverse(nums.begin() + i, nums.end());
                return ;
            }
        }
        reverse(nums.begin(), nums.end()); //不存在,降序=>升序
    }
};

在这里插入图片描述

class Solution {
public:
    int longestValidParentheses(string s) {
        if(s.size() == 0) return 0;
        stack<int> stk;
        stk.push(-1);
        int res = 0;
        for(int i = 0; i < s.size(); i ++)
        {
            if(s[i] == '(') stk.push(i);
            else
            {
                stk.pop();
                if(stk.empty()) stk.push(i);
                else res = max(res, i - stk.top());
            }
        }
        return res;
    }
};

在这里插入图片描述

class Solution {
public:
    int search(vector<int>& nums, int target) {
        if(nums.size() == 0) return -1;
        int left = 0, right = nums.size() - 1;
        if(nums[0] > nums.back())
        {
            int l = 0, r = nums.size() - 1;
            while(l < r)
            {
                int mid = l + r + 1>> 1;
                if(nums[mid] >= nums[0]) l = mid;
                else r = mid - 1;
            }
            if(target < nums[0]) left = l + 1, right = nums.size() - 1;
            else left = 0, right = l;
        }
        while(left < right)
        {
            int mid = left + right >> 1;
            if(nums[mid] >= target) right = mid;
            else left = mid + 1;
        }
        if(nums[left] == target) return left;
        return -1;
    }
};

在这里插入图片描述

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        //二分上界和下界
        vector<int> res;
        int l = 0, r = nums.size() - 1;
        while(l < r)
        {
            int mid = l + r >> 1;
            if(nums[mid] >= target) r = mid;
            else l = mid + 1;
        }        
        if(nums.empty() || nums[r] != target)
        {
            res.push_back(-1);
            res.push_back(-1);
            return res;
        }        
        res.push_back(l);
        l = 0, r = nums.size() - 1;
        while(l < r)
        {
            int mid = l + r + 1 >> 1;
            if(nums[mid] <= target) l = mid;
            else r = mid - 1;
        }
        res.push_back(l);
        return res;
    }
};

在这里插入图片描述

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int l = 0, r = nums.size() - 1;
        while(l < r)
        {
            int mid = l + r >> 1;
            if(nums[mid] >= target) r = mid;
            else l = mid + 1;
        }
        if(nums[l] < target) return nums.size();
        return r;
    }
};

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        vector<vector<int>> rows(9, vector<int>(9, 0));
        vector<vector<int>> cols(9, vector<int>(9, 0));
        vector<vector<int>> blocks(9, vector<int>(9, 0));
        for(int i = 0; i < 9; i ++)
            for(int j = 0; j < 9; j ++)
                if(board[i][j] != '.')
                {
                    int num = board[i][j] - '1';
                    int blockIndex = i / 3 * 3 + j / 3;
                    if(rows[i][num] || cols[j][num] || blocks[blockIndex][num])
                        return false;
                    else{
                        rows[i][num] = 1;
                        cols[j][num] = 1;
                        blocks[blockIndex][num] = 1;
                    }
                }
        return true;
    }
};

在这里插入图片描述

class Solution {
public:
    bool row[9][9], col[9][9], st[3][3][9];
    void solveSudoku(vector<vector<char>>& board) {
        memset(row, 0, sizeof row);
        memset(col, 0, sizeof col);
        memset(st, 0, sizeof st);
        for(int i = 0; i < 9; i ++)
            for(int j = 0; j < 9; j ++)
                if(board[i][j] != '.')
                {
                    int v = board[i][j] - '1';
                    row[i][v] = col[j][v] = st[i / 3][j / 3][v] = true;
                }
        dfs(board, 0, 0);
    }

    bool dfs(vector<vector<char>>&board, int x, int y)
    {
        if(y == 9) y = 0, x ++;
        if(x == 9) return true;

        if(board[x][y] != '.') return dfs(board, x, y + 1);//一列一列遍历
        for(int i = 0; i < 9; i ++)
        {
            if(board[x][y] == '.' && !row[x][i] && !col[y][i] && !st[x/3][y/3][i])
            {
                board[x][y] = '1' + i;
                row[x][i] = col[y][i] = st[x/3][y/3][i] = true;
                if(dfs(board, x, y + 1)) return true;
                board[x][y] = '.';
                row[x][i] = col[y][i] = st[x/3][y/3][i] = false;
            } 
        }
        return false;
    }
};

在这里插入图片描述

class Solution {
public:
    string countAndSay(int n) {
        string s = "1";
        for(int i = 1; i < n; i ++)
        {
            string ns = "";
            for(int j = 0; j < s.size(); )
            {
                int u = j; //记录重复的字符
                while(u < s.size() && s[u] == s[j]) u ++;
                ns += to_string(u - j);
                ns += s[j];
                j = u;
            }
            s = ns;
        }
        return s;
    }
};

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        dfs(candidates, 0, target);
        return res;
    }

    void dfs(vector<int>& c, int u, int t)
    {
        if(u == c.size())
        {
            if(!t) res.push_back(path);
            return;
        }
        dfs(c, u + 1, t);
        while(t >= c[u])
        {
            path.push_back(c[u]);
            t -= c[u];
            dfs(c, u + 1, t);
        }
        while(path.size() && path.back() == c[u]) path.pop_back();
    }
};

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(), candidates.end());
        dfs(candidates, 0, target);
        return res;
    }

    void dfs(vector<int>& c, int u, int t)
    {
        if(t < 0) return ;
        if(t == 0) res.push_back(path);
        else for(int i = u; i < c.size(); i ++)
        {
            if(i != u && c[i] == c[i - 1]) continue;
            path.push_back(c[i]);
            dfs(c, i + 1, t - c[i]);
            path.pop_back();
        }
    }
};
发布了121 篇原创文章 · 获赞 33 · 访问量 7317

猜你喜欢

转载自blog.csdn.net/qq_42549254/article/details/103814931