LeetCode第256场周赛

2E46A3417181C5E2285BE8A1CAEC87ED

心情

题目在此
麻木了😭

第一题(学生分数的最小差值)

class Solution {
public:
    int minimumDifference(vector<int>& nums, int k) {
        sort(nums.begin(),nums.end());
        int n = nums.size();
        int res = 999999;
        for (int i = 0; i+k-1 < n; i ++){
            if (res > nums[i+k-1]-nums[i])res = nums[i+k-1]-nums[i];
        }
        return res;
    }
};

第二题(找出数组中的第 K 大整数)

字符串数组排序。

class cmp{
public:
	bool operator()(const string &a,const string &b) {
		if (a.size() > b.size())return true;
        if (a.size() < b.size())return false;
        for (int i = 0; i < a.size(); i ++){
            if (a[i] > b[i])return true;
            if (a[i] < b[i])return false;
        }
        return false;
	}
};
class Solution {
public:
    string kthLargestNumber(vector<string>& nums, int k) {
        sort(nums.begin(),nums.end(),cmp());
        return nums[k-1];
    }
};

第三题(完成任务的最少工作时间段)

在这里插入图片描述

简单状态压缩DP(我没做出来😭 )
d p [ s ] [ t ] 表 示 状 态 s 剩 余 时 间 t 最 少 的 需 要 的 时 间 段 数 量 dp[s][t]表示状态s剩余时间t最少的需要的时间段数量 dp[s][t]st

int dp[1<<14][18];	//2^14中状态
class Solution {
public:
    int minSessions(vector<int>& tasks, int sessionTime) {
        int n = tasks.size();
        int lim = 1<<n;
        
        memset(dp, -1, sizeof(dp));		//初值设置为-1,便于识别
        dp[0][0] = 0;		//一个工作都没选,不用耗时间
        
        for (int s = 0; s < lim; s++){
            for (int lt = 0; lt <= sessionTime; lt++){
                if (dp[s][lt] == -1) continue;//这个状态没有被更新过,就不能用它来更新别的状态
                for (int i = 0; i < n; i++){
                    if ((s>>i)&1) continue;	  //第i个位子的工作已经在状态里面了
                    if (tasks[i] <= lt){//时间足够第i个工作,那就把第i个工作加入当前这个时间段
                    	//如果dp[s | (1<<i)][lt - tasks[i]]这个状态还没更新过,或者这个状态的值大于dp[s][lt]的值,那么就需要更新。
                        if (dp[s | (1<<i)][lt - tasks[i]] == -1 || dp[s | (1<<i)][lt - tasks[i]] > dp[s][lt])
                            dp[s | (1<<i)][lt - tasks[i]] = dp[s][lt];
                    }else{	//当前状态剩余时间不够这个工作,那么就多加一个时间段
                    	//如果dp[s | (1<<i)][lt - tasks[i]]这个状态还没更新过,或者这个状态的值大于dp[s][lt]+1的值,那么就需要更新。
                        if (dp[s | (1<<i)][sessionTime - tasks[i]] == -1 || dp[s | (1<<i)][sessionTime - tasks[i]] > dp[s][lt] + 1)
                            dp[s | (1<<i)][sessionTime - tasks[i]] = dp[s][lt] + 1;
                    }
                }
            }
        }
        int ans = -1;
        for (int i = 0; i <= sessionTime; i++){
            if (dp[lim - 1][i] == -1) continue;
            if (ans == -1 || ans > dp[lim - 1][i]) ans = dp[lim - 1][i];//枚举所有满足条件的状态,取一个最小值。
        }
        
        return ans;
    }
};

第四题(不同的好子序列数目)

下 次 一 定 😭 下次一定😭 😭

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值