LeetCode 2485. Find the Pivot Integer【前缀和;枚举;数学;查表】简单

news/2024/10/18 0:35:09/

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

给你一个正整数 n ,找出满足下述条件的 中枢整数 x :

  • 1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和。

返回中枢整数 x 。如果不存在中枢整数,则返回 -1 。题目保证对于给定的输入,至多存在一个中枢整数。

示例 1:

输入:n = 8
输出:6
解释:6 是中枢整数,因为 1 + 2 + 3 + 4 + 5 + 6 = 6 + 7 + 8 = 21

示例 2:

输入:n = 1
输出:1
解释:1 是中枢整数,因为 1 = 1

示例 3:

输入:n = 4
输出:-1
解释:可以证明不存在满足题目要求的整数。

提示:

  • 1 <= n <= 1000

解法1 枚举 或 前缀和

根据题意,我们从 1 1 1 开始遍历到 n n n ,并求前缀和,如果包含当前元素 x x x 的前缀和 s u m sum sum 等于 n × ( n + 1 ) / 2 − s u m + x n\times (n + 1) / 2 - sum + x n×(n+1)/2sum+x ,则说明当前元素 x x x 是中枢整数。

class Solution {
public:int pivotInteger(int n) {int sum = 0, tot = n * (n + 1) / 2;for (int x = 1; x <= n; ++x) {sum += x;if (sum == tot - sum + x) return x;}return -1;}
};

又或者,我们不用求前缀和,而是在 [ 1 , n ] [1,n] [1,n] 的范围内枚举 x x x ,判断以下等式是否成立。若成立,则 x x x 为中枢整数。
( 1 + x ) × x = ( x + n ) × ( n − x + 1 ) (1 + x) \times x = (x + n) \times (n - x + 1) (1+x)×x=(x+n)×(nx+1)

class Solution {
public:int pivotInteger(int n) {for (int x = 1; x <= n; ++x)if ((1 + x) * x == (x + n) * (n - x + 1))return x;return -1;}
};

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n) ,其中 n n n 为给定的正整数 n n n
  • 空间复杂度: O ( 1 ) O(1) O(1)

解法2 数学O(1)

1 1 1 x x x 的元素和为 x ( x + 1 ) 2 \dfrac{x(x+1)}{2} 2x(x+1) x x x n n n 的元素和为 1 1 1 n n n 的元素和减去 1 1 1 x − 1 x-1 x1 的元素和,即 n ( n + 1 ) − x ( x − 1 ) 2 \dfrac{n(n+1)-x(x-1)}{2} 2n(n+1)x(x1) 。两式相等,简化后即

x = n ( n + 1 ) 2 x = \sqrt{\dfrac{n(n+1)}{2}} x=2n(n+1)

如果 x x x 不是整数则返回 − 1 −1 1

class Solution {
public:int pivotInteger(int n) {int m = n * (n + 1) / 2;int x = sqrt(m);return x * x == m ? x : -1;}
};

复杂度分析:

  • 时间复杂度: O ( 1 ) O(1) O(1) 。计算平方根有专门的 CPU 指令,可以视作是 O ( 1 ) O(1) O(1) 时间。Python 的 math.isqrt 用的牛顿迭代法,这里也视作 O ( 1 ) O(1) O(1)
  • 空间复杂度: O ( 1 ) O(1) O(1) ,仅用到若干变量。

解法3 查表O(1)

注意到 n ( n + 1 ) 2 \dfrac{n(n+1)}{2} 2n(n+1) 又叫三角数 triangular number(见 OEIS A000217),定义是:非负整数前 n n n 项和, 0 + 1 + 2 + … + n 0 + 1 + 2 + … + n 0+1+2++n 。如 0 , 1 , 3 , 6 , 10 , 15 , 21 , 28 , 36 , 45 , 55 , 66 , 78 , 91 , 105 , 120 , 136 , 153 , 171 , 190 , 210 , 231 , 253 , 276 , 300 , 325 , 351 , 378 , 406 , 435 , 465 , 496 , 528 , 561 , 595 , 630 , 666 , 703 , 741 , 780 , 820 , 861 , 903 , 946 , 990 , 1035 , 1081 , 1128 , 1176 , 1225 , 1275 , 1326 , 1378 , 1431 , … 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300, 325, 351, 378, 406, 435, 465, 496, 528, 561, 595, 630, 666, 703, 741, 780, 820, 861, 903, 946, 990, 1035, 1081, 1128, 1176, 1225, 1275, 1326, 1378, 1431, … 0,1,3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210,231,253,276,300,325,351,378,406,435,465,496,528,561,595,630,666,703,741,780,820,861,903,946,990,1035,1081,1128,1176,1225,1275,1326,1378,1431, 帮助理解的方式:想像有一堆包子摆成杨辉三角的形状,前 n n n 行包子的数量之和就是第 n n n 个三角数。

一个三角数是完全平方数的情况(见 OEIS A001108),定义是:第 n n n 个(base 0)三角数同时是一个平方数。如 0 , 1 , 8 , 49 , 288 , 1681 , 9800 , 57121 , 332928 , 1940449 , 11309768 , 65918161 , 384199200 , … 0, 1, 8, 49, 288, 1681, 9800, 57121, 332928, 1940449, 11309768, 65918161, 384199200, … 0,1,8,49,288,1681,9800,57121,332928,1940449,11309768,65918161,384199200, 比如:

  • 1 1 1 个三角数是 1 1 1 ,它是 1 1 1 的平方
  • 8 8 8 个三角数, 8 × ( 8 + 1 ) / 2 = 36 8 \times (8 + 1) / 2 = 36 8×(8+1)/2=36 ,它是 6 6 6 的平方
  • 49 49 49 个三角数, 49 × ( 49 + 1 ) / 2 = 1225 49 \times (49 + 1) / 2 = 1225 49×(49+1)/2=1225 ,它是 35 35 35 的平方
  • 288 288 288 个三角数, 288 × ( 288 + 1 ) / 2 = 41616 288 \times (288 + 1) / 2 = 41616 288×(288+1)/2=41616 ,它是 204 204 204 的平方

一个数的平方数是三角数的情况(见 OEIS A001109)。如 0 , 1 , 6 , 35 , 204 , 1189 , 6930 , 40391 , 235416 , 1372105 , 7997214 , 46611179 , 271669860 , 1583407981 , … 0, 1, 6, 35, 204, 1189, 6930, 40391, 235416, 1372105, 7997214, 46611179, 271669860, 1583407981, … 0,1,6,35,204,1189,6930,40391,235416,1372105,7997214,46611179,271669860,1583407981, 比如:

  • 1 1 1 的平方 1 1 1 是三角数
  • 6 6 6 的平方 36 36 36 是三角数
  • 35 35 35 的平方 1225 1225 1225 是三角数
  • 204 204 204 的平方 41616 41616 41616 是三角数

即在本题数据范围下,这种「是三角数也是完全平方数的情况」是很少的。 n n n 只有 1 , 8 , 49 , 288 1,8,49,288 1,8,49,288
这四个,对应的答案为
1 , 6 , 35 , 204 1,6,35,204 1,6,35,204
上述数据用程序枚举 [ 1 , 1000 ] [1,1000] [1,1000] 内的 n n n ,调用上面的代码,即可得到。

class Solution {const unordered_map<int, int> m{{1, 1}, {8, 6}, {49, 35}, {288, 204}};
public:int pivotInteger(int n) {auto it = m.find(n);return it != m.end() ? it->second : -1;}
};

复杂度分析:

  • 时间复杂度: O ( 1 ) O(1) O(1)
  • 空间复杂度: O ( 1 ) O(1) O(1) ,仅用到若干变量。

http://www.ppmy.cn/news/708619.html

相关文章

Spring Boot 中的 @EnableDiscoveryClient 注解

Spring Boot 中的 EnableDiscoveryClient 注解 Spring Boot 是一个快速开发 Spring 应用程序的框架&#xff0c;它提供了一些基础设施&#xff0c;使得我们可以快速地开发出高效、可靠的应用程序。其中&#xff0c;EnableDiscoveryClient 注解是 Spring Boot 中一个非常重要的…

图论相关知识

简单介绍 就我2018年暑假这阵子练过的区域赛题目来看 图论题网络流居多&#xff0c;一般是稍难的签到&#xff08;需要多做点网络流的题目&#xff09;另外由于DAG的性质&#xff0c;很容易的能够有一些经典的DP&#xff0c;也可以注意一下。其他的主要还是会套模板吧。 一定…

CTSC/APIO2018游记

Day0 早上赶公交去衡水站&#xff0c;坐了一上午硬座来北京&#xff0c;车上看完了时政资料和半本《文化生活》……下火车之后一个小时地铁7号线转14号线&#xff0c;然后走了1.6km到酒店&#xff0c;中午没饭吃。早就做好了住大床房的准备&#xff0c;入住房间发现这床好像比我…

模板一:图论

目录 个人ACM模板总结 一、图论 &#xff08;一&#xff09;链式前向星 &#xff08;二&#xff09;最短路 1.单源最短路 1)dijkstra算法 2)SPFA 2.多源最短路 1)Floyd 3.传递闭包 4.最短路径树 1)最短路径树计数 2)去掉图中一条边之后最短路径树大小&#xff08;…

Contest1030 - 2017级新生周赛(三)E

1325 Problem E 题目描述 啊啊啊&#xff0c;又是喜闻乐见的英灵召唤环节了&#xff0c;只不过这次的英灵召唤有些许的不一样&#xff0c;这次我们不再是通过圣遗物召唤了&#xff0c;而是通过一些蕴含着魔力的宝石来召唤英灵&#xff0c;现在在地上摆着n个魔法宝石&#xff…

借助navicat,把一个数据库里面的部分表数据,导入另一个数据库中

背景 准备 在navicat里面创建两个数据库&#xff0c;一个是n1,另一个是n2 n1:有数据&#xff0c;需要把n1里面的部分表数据导入到n2里面 n2:被导入的数据库 给n1录入数据 给n2导入部分数据 点击工具---》 点击数据传输 选择导入和导出的数据库 点击自定义&#xff0c;选择自己…

如何用微信公众号快速注册小程序

https://jingyan.baidu.com/article/ceb9fb109fab828cad2ba0ca.html 1 2 3 4 5 6 7 分步阅读 为方便公众号快捷接入小程序&#xff0c;并在各功能中使用小程序的服务&#xff0c;上线复用公众号资质注册小程序流程。快速注册认证小程序&#xff0c;无需重新提交主体材料、无需对…

企业微信公众号怎么建立和运营?

企业公众号的建立 万事开头难&#xff0c;公司微信公众号运营也同样如此。公司公众号如何建立和运营&#xff1f;接下来轩雨阁网络小编就帮助大家从企业公众号的注册账号开始&#xff0c;一步步教给大家做好企业公众号。 微信服务号or微信订阅号 从信息发送频次而言&#xff…