电子商务网站业务流程商城源码价格低 质量好

张小明 2026/1/2 21:23:38
电子商务网站业务流程,商城源码价格低 质量好,wordpress主题 工作室,深圳企业网站建设服务平台1 题目 2815. 数组中的最大数对和 给你一个下标从 0 开始的整数数组 nums 。请你从 nums 中找出和 最大 的一对数#xff0c;且这两个数数位上最大的数字相等。 返回最大和#xff0c;如果不存在满足题意的数字对#xff0c;返回 -1 。 示例 1#xff1a; 输入#x…1 题目2815. 数组中的最大数对和给你一个下标从0开始的整数数组nums。请你从nums中找出和最大的一对数且这两个数数位上最大的数字相等。返回最大和如果不存在满足题意的数字对返回-1。示例 1输入nums [51,71,17,24,42]输出88解释i 1 和 j 2 nums[i] 和 nums[j] 数位上最大的数字相等且这一对的总和 71 17 88 。 i 3 和 j 4 nums[i] 和 nums[j] 数位上最大的数字相等且这一对的总和 24 42 66 。 可以证明不存在其他数对满足数位上最大的数字相等所以答案是 88 。示例 2输入nums [1,2,3,4]输出-1解释不存在数对满足数位上最大的数字相等。提示2 nums.length 1001 nums[i] 1042 代码实现class Solution { public: int maxSum(vectorint nums) { pairint, int digitPairs[10] {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}}; for (int num : nums) { int maxDigit 0; int temp num; while (temp 0) { maxDigit max(maxDigit, temp % 10); temp / 10; } int secondMax digitPairs[maxDigit].first; int firstMax digitPairs[maxDigit].second; if (num firstMax) { secondMax firstMax; firstMax num; } else if (num secondMax) { secondMax num; } digitPairs[maxDigit] {secondMax, firstMax}; } int result -1; for (int i 0; i 10; i) { int secondMax digitPairs[i].first; int firstMax digitPairs[i].second; if (secondMax ! -1 firstMax ! -1) { result max(result, secondMax firstMax); } } return result; } };见鬼了easy题不会用一次遍历说白了练的太少了我还是生疏又生疏。题解第一步先搞懂 “数位最大数字” 怎么算最基础的部分比如数字 71咱们要找它每一位里最大的数71 的最后一位是 171%101最大数暂时是 1去掉最后一位变成 771/107最后一位是 77%107比 1 大最大数更新成 7再去掉最后一位变成 0循环结束。所以 71 的 “数位最大数字” 是 7。这个操作很固定不管什么数字都用 “取余%10 整除/10” 就能算出来记死这个套路就行。第二步为什么要 “按数位分类存最大的两个数”题目要找 “数位最大数字相等” 的两个数而且和最大。那咱们可以这么想把所有数字按 “数位最大数字” 分成 10 类0~9比如 71、17 都归到 “7” 类每一类里只要有两个数它们的和就是这个类里的 “候选最大和”要让这个类的和最大只需要留这个类里最大的两个数就行比如 “7” 类里有 71 和 17留这两个它们的和就是最大的。所以咱们不用管其他数每一类只记前两名最大、次大效率最高。第三步用代码一步一步跟着做核心代码实现// 核心函数解决数组中的最大数对和问题 int maxSum(vectorint nums) { // 定义pair数组下标数位的最大值0~9pair次大值, 最大值初始值为-1表示无数字 pairint, int digitPairs[10] {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}}; // 第一步一次遍历数组更新每个数位对应的最大两个数 for (int num : nums) { // 1. 计算当前数字的数位中最大的数字 int maxDigit 0; int temp num; while (temp 0) { maxDigit max(maxDigit, temp % 10); // 取最后一位并更新最大数位 temp / 10; // 去掉最后一位 } // 2. 更新当前数位对应的次大值和最大值 int secondMax digitPairs[maxDigit].first; // 次大值 int firstMax digitPairs[maxDigit].second; // 最大值 if (num firstMax) { // 新数字比最大值大次大值变为原来的最大值最大值变为新数字 secondMax firstMax; firstMax num; } else if (num secondMax) { // 新数字比次大值大、比最大值小仅更新次大值 secondMax num; } // 把更新后的值存回数组 digitPairs[maxDigit] {secondMax, firstMax}; } // 第二步遍历数位数组计算最大数对和 int result -1; for (int i 0; i 10; i) { int secondMax digitPairs[i].first; int firstMax digitPairs[i].second; // 只有次大值和最大值都不为-1时才存在有效数对 if (secondMax ! -1 firstMax ! -1) { result max(result, secondMax firstMax); } } return result; }int maxSum(vectorint nums) { // 1. 准备一个“分类容器”10个位置0~9每个位置存两个数次大、最大初始都是-1表示没数字 pairint, int digitPairs[10] {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}}; // 2. 遍历每个数字逐个分类、更新最值 for (int num : nums) { // 2.1 先算当前数字的“数位最大数字”套固定套路 int maxDigit 0; int temp num; // 临时变量避免修改原数字 while (temp 0) { maxDigit max(maxDigit, temp % 10); // 取最后一位更新最大数位 temp temp / 10; // 去掉最后一位 } // 2.2 把当前数字放进对应的“类”里只留最大的两个数 int 次大 digitPairs[maxDigit].first; int 最大 digitPairs[maxDigit].second; if (num 最大) { // 比当前最大还大挤掉原来的最大 次大 最大; 最大 num; } else if (num 次大) { // 比次大大但比最大小挤掉原来的次大 次大 num; } digitPairs[maxDigit] {次大, 最大}; // 把更新后的前两名存回去 } // 3. 找所有类里“次大最大”的最大值 int result -1; for (int i 0; i 10; i) { int 次大 digitPairs[i].first; int 最大 digitPairs[i].second; if (次大 ! -1 最大 ! -1) { // 这个类里至少有两个数 result max(result, 次大 最大); } } return result; }现在试着代入示例 1 走一遍彻底理解示例 1nums [51,71,17,24,42]51 的数位最大是 5 → 归到 “5” 类类里变成-1,5171 的数位最大是 7 → 归到 “7” 类类里变成-1,7117 的数位最大是 7 → 归到 “7” 类17 次大-1但 最大71类里变成17,7124 的数位最大是 4 → 归到 “4” 类变成-1,2442 的数位最大是 4 → 归到 “4” 类4224类里变成24,42最后算所有类的和“7” 类 177188“4” 类 244266 → 最大是 88。关键不用死记复杂逻辑记 3 个 “固定动作”算数位最大数字用 while 循环 %10%10套公式就行分类存最值每个类只留前两名按 “比最大大→更新两个比次大大→更新一个” 来算最终结果遍历所有类有两个数的就求和取最大。超详细题解先给一个通俗的比喻理解核心逻辑把这个问题想象成学校举办运动会有10 个项目对应 0~9 这 10 个 “数位最大数字”每个学生对应数组里的数字只能参加一个项目比如数字 71 的数位最大是 7就参加项目 7数字 17 的数位最大也是 7也参加项目 7。现在要从每个项目里选两名学生让他们的体重和最大对应数字和最大最后在所有项目的组合里选体重和最大的那个。那我们根本不用记每个项目的所有学生只需要记每个项目里体重最大的两个学生最大、次大就行因为这两个的和肯定是该项目里最大的。这个比喻就是代码的核心逻辑接下来我们结合示例和代码逐行走一遍。结合示例 1 逐行拆解代码nums [51,71,17,24,42]我们先把代码里的变量名换成更直白的中文注释再跟着示例走int maxSum(vectorint nums) { // 定义digitPairs[0~9] 对应10个项目每个项目存次大数字, 最大数字初始都是-1表示没人参加 pairint, int digitPairs[10] {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}}; // 遍历每个数字每个学生 for (int num : nums) { // 第一步算当前数字属于哪个项目数位最大数字 int maxDigit 0; // 项目编号 int temp num; // 临时变量比如num71时temp71 while (temp 0) { maxDigit max(maxDigit, temp % 10); // 取最后一位71%101 → maxDigit17%107 → maxDigit7 temp / 10; // 去掉最后一位71→7→0循环结束 } // 此时num71的maxDigit7属于项目7num17的maxDigit7也属于项目7 // 第二步把当前数字加入对应项目只留最大的两个 int 次大 digitPairs[maxDigit].first; // 项目里的次大数字 int 最大 digitPairs[maxDigit].second; // 项目里的最大数字 if (num 最大) { // 比当前最大的还大挤掉原来的最大 次大 最大; // 原来的最大变成次大 最大 num; // 当前数字变成新的最大 } else if (num 次大) { // 比次大的大比最大的小挤掉原来的次大 次大 num; } // 把更新后的结果存回去 digitPairs[maxDigit] {次大, 最大}; } // 第三步找所有项目里两个数字的和的最大值 int result -1; for (int i 0; i 10; i) { int 次大 digitPairs[i].first; int 最大 digitPairs[i].second; // 只有项目里有至少两个人次大和最大都不是-1才计算和 if (次大 ! -1 最大 ! -1) { result max(result, 次大 最大); } } return result; }现在跟着示例 1 的数字逐个走一遍关键步骤示例 1 的 nums [51,71,17,24,42]我们逐个处理每个数字处理第一个数字51算 maxDigit51 的数位是 5 和 1maxDigit5属于项目 5。项目 5 当前是 {-1, -1}所以最大51次大-1存回去digitPairs [5] {-1, 51}。处理第二个数字71算 maxDigit71 的数位是 7 和 1maxDigit7属于项目 7。项目 7 当前是 {-1, -1}所以最大71次大-1存回去digitPairs [7] {-1, 71}。处理第三个数字17算 maxDigit17 的数位是 1 和 7maxDigit7属于项目 7。项目 7 当前是 {-1, 71}17 次大(-1)所以次大17最大71存回去digitPairs [7] {17, 71}。处理第四个数字24算 maxDigit24 的数位是 2 和 4maxDigit4属于项目 4。项目 4 当前是 {-1, -1}所以最大24次大-1存回去digitPairs [4] {-1, 24}。处理第五个数字42算 maxDigit42 的数位是 4 和 2maxDigit4属于项目 4。项目 4 当前是 {-1, 24}42 最大(24)所以次大24最大42存回去digitPairs [4] {24, 42}。最后计算所有项目的和项目 5只有 51次大 -1不计算。项目 7177188当前 result88。项目 4244266比 88 小result 还是 88。其他项目都是 - 1不计算。最终返回 88和示例结果一致。再解释你可能卡壳的两个点1. 为什么只需要存最大的两个数比如项目 7 里有 71、17哪怕还有其他数比如 77117 的和也肯定比 717、177 的和大。所以只要保留最大的两个数它们的和就是该类别下的最大值不用存所有数这是代码高效的关键。2. 为什么初始值是 - 1因为题目里的数字都是正整数1≤nums [i]≤10^4用 - 1 表示 “该类别下还没有数字”这样后续判断 “是否有至少两个数” 时只要看次大和最大是不是都不等于 - 1 就行。总结核心逻辑按 “数位最大数字” 分类每个类别只保留最大的两个数最后算这些数对的和的最大值。代码三步曲算每个数字的 “数位最大数字”确定类别把数字加入对应类别更新该类别的最大、次大值遍历所有类别计算有效数对的和的最大值。记住那个 “运动会项目” 的比喻就能把抽象的代码逻辑转化成直观的场景就不会懵了。3 题目2364. 统计坏数对的数目给你一个下标从0开始的整数数组nums。如果i j且j - i ! nums[j] - nums[i]那么我们称(i, j)是一个坏数对。请你返回nums中坏数对的总数目。示例 1输入nums [4,1,3,3]输出5解释数对 (0, 1) 是坏数对因为 1 - 0 ! 1 - 4 。 数对 (0, 2) 是坏数对因为 2 - 0 ! 3 - 4, 2 ! -1 。 数对 (0, 3) 是坏数对因为 3 - 0 ! 3 - 4, 3 ! -1 。 数对 (1, 2) 是坏数对因为 2 - 1 ! 3 - 1, 1 ! 2 。 数对 (2, 3) 是坏数对因为 3 - 2 ! 3 - 3, 1 ! 0 。 总共有 5 个坏数对所以我们返回 5 。示例 2输入nums [1,2,3,4,5]输出0解释没有坏数对。提示1 nums.length 1051 nums[i] 1094 代码实现class Solution { public: long long countBadPairs(vectorint nums) { int n nums.size(); long long total (long long )n* (n - 1) / 2 ; unordered_map int , long long keyCount ; long long goodPairs 0 ; for (int i 0 ; i n ; i){ int key nums[i] - i ; goodPairs keyCount[key] ; keyCount[key]; } return total - goodPairs; } };超时了错误的代码绝对超时了是不是用unordered_map不知怎么写哇...class Solution { public: long long countBadPairs(vectorint nums) { int n nums.size(); int count 0 ; for (int i 0 ; i n ; i ){ for (int j n - 1 ; j i ; j --){ if (j - i ! nums[j]- nums[i]){ count ; } } } return count ; } };你现在要解决的是 “统计坏数对的数目” 问题你的嵌套循环写法确实会超时时间复杂度(O(n^2))n 大的时候根本跑不通而核心优化思路就是用unordered_map来统计规律把时间复杂度降到(O(n))。我先帮你理清思路再给出完整代码。核心需求梳理你需要统计数组中满足j - i ≠ nums[j] - nums[i]的数对 (i, j)i j的数量直接嵌套循环会超时需要用哈希表unordered_map找数学规律来优化。解题思路关键是数学变形 反向统计首先做数学公式变形这是解题的核心完整代码实现#include vector #include unordered_map using namespace std; class Solution { public: long long countBadPairs(vectorint nums) { int n nums.size(); // 1. 计算所有数对的总数组合数n选2 long long total (long long)n * (n - 1) / 2; // 2. 用unordered_map统计每个keynums[k]-k出现的次数 unordered_mapint, long long keyCount; long long goodPairs 0; // 好数对数量 for (int k 0; k n; k) { int key nums[k] - k; // 注意这里要先累加当前key已出现的次数再更新map // 因为当前k和之前出现的所有同key的下标ii k都能组成好数对 goodPairs keyCount[key]; keyCount[key]; } // 3. 坏数对 总数 - 好数对 return total - goodPairs; } };代码关键部分解释总数计算用(long long)n * (n - 1) / 2是为了避免整数溢出n 可能很大比如 1e5n*(n-1) 会超过 int 的范围所以先转 long long。key 的定义key nums[k] - k这是从数学变形中得到的核心标识。好数对统计逻辑遍历每个下标 k 时keyCount[key]表示在 k 之前有多少个下标 i 的 key 和当前 k 的 key 相同。这些 i 都能和 k 组成好数对因为 i k所以先把这个数量加到goodPairs里。然后把当前 key 的计数加 1供后续下标使用。最终结果总数减去好数对数量就是坏数对数量。举个例子帮你理解比如 nums [4,1,3,3]n4总数 4*3/26。遍历每个 kk0key4-04keyCount[4]0 → goodPairs0 → keyCount[4]1。k1key1-10keyCount[0]0 → goodPairs0 → keyCount[0]1。k2key3-21keyCount[1]0 → goodPairs0 → keyCount[1]1。k3key3-30keyCount [0]1 → goodPairs 1现在 goodPairs1→ keyCount [0]2。好数对数量 1坏数对数量 6-15。goodPairs keyCount[key] ;keyCount[key]; //这两行什么意思?这两行是统计好数对的核心逻辑也是最容易绕晕的地方我用通俗的语言 具体例子给你讲透保证你能懂。先明确两个前提好数对的条件下标i k注意这里把原来的j换成了k只是变量名变了且nums[i]-i nums[k]-k也就是两个下标对应的key相等。keyCount[key]的含义在遍历到当前下标k时keyCount[key]存储的是在k之前也就是i k有多少个下标i的key和当前k的key相等。逐行解释第一行goodPairs keyCount[key];这句话的意思是把当前k能和前面的i组成的好数对数量加到总好数对里。比如当遍历到k时keyCount[key]是 3说明前面有 3 个下标i的key和k的一样那么k就能和这 3 个i分别组成 3 个好数对所以总好数对要加 3。第二行keyCount[key];这句话的意思是把当前k的key加入统计让后续的下标能找到它。因为后续会遍历到k1、k2等下标这些下标需要知道 “前面有多少个和自己key相同的下标”所以要把当前k的key计数加 1。用具体例子一步一步走最直观还是用之前的例子nums [4,1,3,3]我们逐个遍历下标k看这两行的执行过程初始状态goodPairs 0keyCount是空的没有任何key的统计1. 遍历k0nums[0]4key 4 - 0 4此时keyCount[4] 0前面没有任何下标所以goodPairs 0→goodPairs还是 0。然后keyCount[4]→keyCount[4] 1现在统计里有了 k0 的 key。2. 遍历k1nums[1]1key 1 - 1 0此时keyCount[0] 0所以goodPairs 0→ 还是 0。然后keyCount[0]→keyCount[0] 1统计里有了 k1 的 key。3. 遍历k2nums[2]3key 3 - 2 1此时keyCount[1] 0所以goodPairs 0→ 还是 0。然后keyCount[1]→keyCount[1] 1统计里有了 k2 的 key。4. 遍历k3nums[3]3key 3 - 3 0此时keyCount[0] 1前面有 k1 的 key 是 0所以goodPairs 1→goodPairs变成 1。然后keyCount[0]→keyCount[0] 2统计里有了 k1 和 k3 的 key。为什么不能反过来写易错点提醒如果把两行顺序换成keyCount[key]; goodPairs keyCount[key];会出问题因为这样会把当前 k 自己也算进去keyCount[key]变成了 “前面的数量 1”导致统计的好数对数量变多比如上面的 k3会加 2 而不是 1结果就错了。所以必须先累加前面的数量再把自己加入统计这是关键顺序。总结goodPairs keyCount[key]统计当前下标k能和前面的下标组成的好数对数量加到总数里。keyCount[key]把当前下标k的key加入统计供后续下标使用。这两行的顺序不能颠倒否则会错误地把当前下标自己算进去导致结果出错。核心优化点是数学公式变形将坏数对条件转化为好数对的nums[k]-k相等和反向统计总数减好数对避免了嵌套循环。unordered_map 的作用是统计每个 key 的出现次数从而快速计算好数对数量时间复杂度降到 (O(n))。注意整数溢出问题需要用long long类型存储总数、好数对数量等变量。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做会员卡网站有wordpress使用经验

复位电路真的会让STLink连不上?一个被忽视的硬件“隐疾”深度剖析你有没有遇到过这样的场景:开发板接上STLink,打开STM32CubeProgrammer或者ST-Link Utility,点击“Connect”,结果弹出:“No target connect…

张小明 2025/12/31 7:20:50 网站建设

网站开发学习路线台州云建站模板

USBToolBox终极指南:5步轻松实现跨平台USB精准映射 【免费下载链接】tool the USBToolBox tool 项目地址: https://gitcode.com/gh_mirrors/too/tool USBToolBox是一款专业的跨平台USB映射工具,支持Windows和macOS双系统,能够智能构建…

张小明 2025/12/29 15:38:45 网站建设

天门网站网站建设南宁建设信息网

Assistant-UI代码高亮终极指南:AI对话美化免费方案 【免费下载链接】assistant-ui React Components for AI Chat 项目地址: https://gitcode.com/GitHub_Trending/as/assistant-ui 在AI对话应用中,清晰的代码展示直接影响用户体验。Assistant-UI…

张小明 2025/12/31 6:32:01 网站建设

北京公司网站制作要多少钱长治制作网站

第一章:VSCode跑不动量子算法?,90%工程师忽略的4个关键性能陷阱在开发量子算法时,许多工程师选择 VSCode 作为主要编辑器,但常遭遇卡顿、延迟甚至崩溃。问题往往不在于硬件配置,而在于未察觉的性能陷阱。扩…

张小明 2025/12/30 23:23:48 网站建设

如果做局域网影音网站中小企业网站制作报价

iCSS代码块组件:5个让你告别枯燥代码展示的终极方案 【免费下载链接】iCSS 不止于 CSS 项目地址: https://gitcode.com/GitHub_Trending/ic/iCSS 还在为技术文档中单调的代码展示而烦恼吗?🤔 每次写技术文章时,你是否遇到过…

张小明 2025/12/29 15:36:55 网站建设

仓山福州网站建设营销型网站建设合同范本

5分钟掌握智能推荐:图神经网络在MXNet中的实战应用 【免费下载链接】mxnet 项目地址: https://gitcode.com/gh_mirrors/mx/mxnet 还在为传统推荐算法的稀疏数据问题头疼吗?🤔 面对海量用户行为数据,你是否在寻找更高效的建…

张小明 2025/12/29 15:36:19 网站建设