leetcode解题思路分析(九十八)846 - 852 题

2024-09-05 04:48

本文主要是介绍leetcode解题思路分析(九十八)846 - 852 题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 一手顺子
    爱丽丝有一手(hand)由整数数组给定的牌。 现在她想把牌重新排列成组,使得每个组的大小都是 W,且由 W 张连续的牌组成。如果她可以完成分组就返回 true,否则返回 false。

记录每个牌是否用过,排序后依次找即可

class Solution {
public:bool isNStraightHand(vector<int>& hand, int groupSize) {int len = hand.size();// 两种特例if(len % groupSize != 0) return false; // 不能整除 直接返回falseif(groupSize == 1) return true; // groupSize为1 直接返回true// 排序sort(hand.begin(),hand.end());// 记录数组元素是否被用过vector<int> used(len,false);// i为第一个指针 遍历hand数组 for(int i=0;i<len;i++){// 元素已被使用则跳过if(used[i]) continue;// 剩下的牌数量不足以构成一个新的Wif(i>len-groupSize) return false;// 取use[i]为这一手牌中的第一张牌 并记录该牌已被使用int cur = hand[i];            used[i] = true;int tar = cur + 1; // tar为下一张需要找到的牌int end = cur + groupSize - 1;// end为这一手牌中的最后一张牌for(int j=i+1;j<len;j++){if(used[j]) continue; // 若已被用过 则跳过if(hand[j]>tar) return false;// hand[j]>tar 说明缺少需要的牌else if(hand[j]==tar){// hand[j]==tar 说明已找到下一张需要的牌used[j] = true;if(hand[j]==end)break; // 已找到end这张牌 跳出循环 重新开始找新的一组牌// 还未到end 继续找下一个tarelse tar++;}}}return true;}
};
  1. 访问所有节点的最短路径
    存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号。给你一个数组 graph 表示这个图。其中,graph[i] 是一个列表,由所有与节点 i 直接相连的节点组成。返回能够访问所有节点的最短路径的长度。你可以在任一节点开始和停止,也可以多次重访节点,并且可以重用边

采用BFS+状态压缩得解

class Solution {
public:int shortestPathLength(vector<vector<int>>& graph) {int n = graph.size();// 1.初始化队列及标记数组,存入起点queue< tuple<int, int, int> > q; // 三个属性分别为 idx, mask, distvector<vector<bool>> vis(n, vector<bool>(1 << n)); // 节点编号及当前状态for(int i = 0; i < n; i++) {q.push({i, 1 << i, 0}); // 存入起点,起始距离0,标记vis[i][1 << i] = true;}// 开始搜索while(!q.empty()) {auto [cur, mask, dist] = q.front(); // 弹出队头元素q.pop();// 找到答案,返回结果if(mask == (1 << n) - 1) return dist;// 扩展for(int x : graph[cur]) {int nextmask = mask | (1 << x);if(!vis[x][nextmask]) {q.push({x, nextmask, dist + 1});vis[x][nextmask] = true;}}}return 0;}
};
  1. 字母移位
    有一个由小写字母组成的字符串 S,和一个整数数组 shifts。我们将字母表中的下一个字母称为原字母的 移位(由于字母表是环绕的, ‘z’ 将会变成 ‘a’)。例如·,shift(‘a’) = ‘b’, shift(‘t’) = ‘u’,, 以及 shift(‘z’) = ‘a’。对于每个 shifts[i] = x , 我们会将 S 中的前 i+1 个字母移位 x 次。返回将所有这些移位都应用到 S 后最终得到的字符串。

前缀和的使用

class Solution {
public:string shiftingLetters(string s, vector<int>& shifts) {vector<int>presum;long long sumall=shifts.back();presum.push_back(sumall);reverse(shifts.begin(),shifts.end());for(int i=1;i<shifts.size();i++){sumall%=26;sumall+=shifts[i];sumall%=26;presum.push_back(sumall);}reverse(presum.begin(),presum.end());//cout<<presum[2]<<endl;for(int i=0;i<s.size();i++){int inter=presum[i]%26;int index=s[i]-'a';s[i]=(inter+index)%26+'a';}return s;}
};
  1. 到最近的人的最大距离
    给你一个数组 seats 表示一排座位,其中 seats[i] = 1 代表有人坐在第 i 个座位上,seats[i] = 0 代表座位 i 上是空的(下标从 0 开始)。至少有一个空座位,且至少有一人已经坐在座位上。亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上。返回他到离他最近的人的最大距离。

双指针滑动解题

class Solution {
public:int maxDistToClosest(vector<int>& seats) {int pre = -1;   //上一个已坐位置,初始值为-1int maxdis = 0; //两个已坐位置间的最大长度int n = seats.size();for (int i = 0; i < n; i++) {if (seats[i] == 1) {    //已坐座位//第一个已坐座位if (pre == -1) {maxdis = i * 2;}else if (i - pre > 1) {maxdis = max(maxdis, i - pre - 1);}pre = i;    //更新pre}//非已坐座位且是最后一个座位else if (i == n - 1) {maxdis = max(maxdis, 2 * (i - pre));}}return maxdis - maxdis / 2; //离他最近的人的最大距离为maxdis - maxdis / 2}
};
  1. 矩形面积2
    我们给出了一个(轴对齐的)矩形列表 rectangles 。 对于 rectangle[i] = [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标,(x2,y2)是该矩形右上角的坐标。找出平面中所有矩形叠加覆盖后的总面积。 由于答案可能太大,请返回它对 10 ^ 9 + 7 取模的结果。

线性扫描

class Solution 
{
private:const static int MOD = 1e9 + 7;const static int OPEN = 0;const static int CLOSE = 1;// 计算宽度:其实就是不断累加更大的x的差值即可int QueryWidth(multiset<pair<int,int>>& activate){int res = 0;int maxX = -1;for (auto [x1, x2] : activate){maxX = max(maxX, x1);// 如果x变大了,则计算差值累加更大的宽度res += max(0, x2 - maxX);// 不断更新最大xmaxX = max(maxX, x2);}return res;}public:int rectangleArea(vector<vector<int>>& rectangles) {vector<vector<int>> rec;for (auto v: rectangles){rec.push_back({v[1], OPEN, v[0], v[2]});rec.push_back({v[3], CLOSE, v[0], v[2]});}// 排序从下到上来扫描sort(rec.begin(), rec.end());// 存储面积和int res = 0;// 初始化第一个y的位置int lastY = rec[0][0];// 当前需要计算的面积横坐标 [x1,x2]// 扫描过程中 对于每次OPEN则插入,CLOSE则删除multiset<pair<int,int>> activate;for (const vector<int> r : rec){int y = r[0];int state = r[1];int x1 = r[2];int x2 = r[3];// 累加面积res = (res + (long long)QueryWidth(activate)*(y-lastY)) % MOD;// 更新上一个y坐标lastY = y;// 对于每次OPEN则插入,CLOSE则删除if (state == OPEN){activate.insert({x1, x2});}else{activate.erase(activate.find(pair<int,int>{x1, x2}) );}}return res;}
};
  1. 喧闹和富有
    在一组 N 个人(编号为 0, 1, 2, …, N-1)中,每个人都有不同数目的钱,以及不同程度的安静(quietness)。为了方便起见,我们将编号为 x 的人简称为 "person x "。如果能够肯定 person x 比 person y 更有钱的话,我们会说 richer[i] = [x, y] 。注意 richer 可能只是有效观察的一个子集。另外,如果 person x 的安静程度为 q ,我们会说 quiet[x] = q 。现在,返回答案 answer ,其中 answer[x] = y 的前提是,在所有拥有的钱不少于 person x 的人中,person y 是最安静的人(也就是安静值 quiet[y] 最小的人)。

根据有钱程度进行排序,然后再比较安静值得出最终解。

class Solution {
public:vector<int> loudAndRich(vector<vector<int>>& richer, vector<int>& quiet) {int n = quiet.size();vector<vector<int>> g(n);//有向图,富的指向穷的vector<int> indegree(n, 0);//入度for(auto& r : richer){g[r[0]].push_back(r[1]);indegree[r[1]]++;}queue<int> q;//点的idvector<int> ans(n, -1);for(int i = 0; i< n; i++)ans[i] = i;//初始化最安静的是自己for(int i = 0; i < n; i++){if(indegree[i] == 0){q.push(i);//最富裕的人,入度为0}}while(!q.empty()){int id = q.front();//人的idint q_val = quiet[ans[id]];//到他这为止,最安静的人的安静值q.pop();for(auto nt : g[id])//跟他连接的人(比他穷){if(q_val < quiet[ans[nt]])//比 nt 更安静的人是 ans[nt], 其安静值没有q_val小ans[nt] = ans[id];if(--indegree[nt] == 0)q.push(nt);}}return ans;}
};
  1. 山脉数组的峰顶索引
    符合下列属性的数组 arr 称为 山脉数组 :
    arr.length >= 3
    存在 i(0 < i < arr.length - 1)使得:
    arr[0] < arr[1] < … arr[i-1] < arr[i]
    arr[i] > arr[i+1] > … > arr[arr.length - 1]
    给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < … arr[i - 1] < arr[i] > arr[i + 1] > … > arr[arr.length - 1] 的下标 i 。

二分查找

class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int size = arr.size();int left = 0, right = size, mid = 0, ret = 0;while (left < right){mid = (left + right) / 2;if (arr[mid] > arr[mid + 1]){if (arr[mid] > arr[mid - 1]){ret = mid;break;}right = mid;continue;}else{left = mid;}}return ret;}
};

这篇关于leetcode解题思路分析(九十八)846 - 852 题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137990

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &