365天挑战LeetCode1000题——Day 079 力扣周赛专题 米哈游 检查相同字母间的距离 恰好移动 k 步到达某一位置的方法数目 最长优雅子数组

6167. 检查相同字母间的距离

在这里插入图片描述
简单的遍历,注意每个字母只能遍历一遍,第二次遍历时要跳过,所以需要用一个哈希表来记录

代码实现(自解)

class Solution {
public:
    bool checkDistances(string s, vector<int>& distance) {
        set<char> mySet;
        for (int i = 0; i < s.size(); i++) {
            if (mySet.count(s[i])) continue;
            mySet.emplace(s[i]);
            int j;
            for (j = i + 1; j < s.size(); j++) {
                if (s[j] == s[i]) break; 
            }
            if (j - i - 1 != distance[s[i] - 'a']) return false;
        }
        return true;
    }
};

6168. 恰好移动 k 步到达某一位置的方法数目

在这里插入图片描述
动态规划,记录走k步时,到达任意位置的情况(状态),状态转移就是前一步走到该位置相邻位置方案的加和

代码实现(自解)

class Solution {
private:
    const int num = 1000000007;
public:
    int numberOfWays(int startPos, int endPos, int k) {
        int diff = endPos - startPos;
        if ((k - abs(diff)) % 2 || abs(diff) > k) return 0;
        // if (k == diff) return 1;
        vector<vector<long long>> dp(k + 1, vector<long long>(2 * k + 1));
        dp[0][k] = 1;
        for (int i = 1; i <= k; i++) {
            for (int j = 0; j < 2 * k + 1; j++) {
                if (j == 0) {
                    dp[i][j] = dp[i - 1][j + 1] % num;
                }
                else if (j == 2 * k) {
                    dp[i][j] = dp[i - 1][j - 1] % num;
                }
                else {
                    dp[i][j] = dp[i - 1][j - 1] % num + dp[i - 1][j + 1] % num;
                }
                // cout << dp[i][j];
            }
            // cout << endl;
        }
        return dp[k][k + diff] % num;
    }
};

6169. 最长优雅子数组

在这里插入图片描述
贪心,如果位运算结果为0,那么与该元素相或,然后继续,直到找到一个位运算相与为0的元素,计算长度

代码实现(自解)

class Solution {
public:
    int longestNiceSubarray(vector<int>& nums) {
        /*
        int pre = 0, nex = 1;
        int ans = 1;
        for (int i = 0; i < nums.size(); i++) {
            int total = nums[pre];
            while (nex != nums.size() && !(total & nums[nex])) {
                total = total | nums[nex];
                nex++;
            }
            ans = max(ans, nex - pre);
            int tmp = pre + 1;
            while (!(nums[tmp] & nums[nex])) tmp++;
            nex = min(nex, tmp + 1);
            i = nex;
            pre = nex;
            nex = nex + 1;
        }
        return ans;
        */
        int ans = 1;
        for (int i = 0; i < nums.size(); i++) {
        	int total = nums[i];
            int j;
            for (j = i + 1; j < nums.size(); j++) {
            	if (!(total & nums[j])) {
            		total = nums[j] | total;
            		continue;
				}
				break;
			}
            ans = max(j - i, ans);
        }
        return ans;
    }
};

6170. 会议室 III

在这里插入图片描述
写出来了正确的方法,但是超时了,正确的思路应该按每个会议做一次遍历,我是按每个时间来的,所以错了,这里分享一篇我觉得写得很好的。
基本思路就是模拟了,模拟的细节和数据结构的选用要想清楚,下次继续努力吧!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值