LeetCode 随机刷题1

1053. 交换一次的先前排列

难度:中等。
这个题好奇怪啊,刚开始没看懂,看了题解。感觉这个题没什么意义。

正确解法:

class Solution {
public:
    vector<int> prevPermOpt1(vector<int>& arr) {
        int n = arr.size();
        int a = n;
        for(int i = n - 1; i > 0; i--){
            if(arr[i] < arr[i - 1]){
                a = i - 1;
                break;
            }
        }
        if(a == n)return arr;

        int b = a + 1;
        for(int i = a + 2; i < n; i++){
            if(arr[i] > arr[b] && arr[i] < arr[a])b = i;
        }
        swap(arr[a], arr[b]);
        return arr;
    }
};

结果:
在这里插入图片描述

1000. 合并石头的最低成本

考试要是遇到这种题,我就直接跪下。
看题解都看不太懂。最后也是抄了答案。遇见就放弃。

class Solution {
public:
    int mergeStones(vector<int>& stones, int k) {
        int n = stones.size();
        if((n - 1) % (k - 1) != 0)return - 1;
        vector<vector<vector<int>>> dp(n + 1);
        for(int i = 0; i <= n; i++){
            dp[i].resize(n + 1);
            for(int j = 0; j <= n; j++){
                dp[i][j].resize(k + 1);
            }
        }

        vector<int> sum(n + 1);
        for(int i = 1; i <= n; i++)sum[i] = sum[i - 1] + stones[i - 1];

        for(int step = 2; step <= n; step++){
            for(int i = 1; i <= n - step + 1; i++){
                int j = i + step - 1;
                for(int m = 2; m <= k; m++){
                    dp[i][j][m] = dp[i][i][1] + dp[i + 1][j][m - 1];
                    for(int p = i + k - 1; p < j; p+= k - 1){
                        dp[i][j][m] = min(dp[i][j][m], dp[i][p][1] + dp[p + 1][j][m - 1]);
                    }
                }
                dp[i][j][1] = dp[i][j][k] + sum[j] - sum[i - 1];
            }
        }
        return dp[1][n][1];
    }
};

结果:
在这里插入图片描述

886. 可能的二分法

难度:中等。
标签:深度优先搜索,图。

这个题压根没想到是图,可能之前真的没有做过图的问题吧。

class Solution {

    bool dfs(vector<vector<int>>& graph, vector<int>& group, int i){
        for(int j = 0; j < graph[i].size(); j++){
            if(graph[i][j]){
                if(group[i] == group[j])return false;
                if(group[j] == 0){
                    group[j] = -group[i];
                    if(!dfs(graph, group, j))return false;
                }
            }
        }
        return true;
    }

public:
    bool possibleBipartition(int N, vector<vector<int>>& dislikes) {

        vector<vector<int>> graph(N + 1, vector<int>(N + 1));
        for(int i = 0; i < dislikes.size(); i++){
            graph[dislikes[i][0]][dislikes[i][1]] = 1;
            graph[dislikes[i][1]][dislikes[i][0]] = 1;
        }

        vector<int> group(N + 1);
        for(int i = 1; i <= N; i++){
            if(group[i] == 0){
                group[i] = 1;
                if(!dfs(graph, group, i))return false;
            }
        }
        return true;
    }
};

结果:
在这里插入图片描述

脑子不好了,下次再做吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值