找出中枢整数

标签: 数学 前缀和

难度: Easy

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

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

返回中枢整数 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

Submission

运行时间: 26 ms

内存: 16.0 MB

class Solution:
    def pivotInteger(self, n: int) -> int:
        ans,current,total = -1,0,(1+n)*n/2
        for value in range(1,n+1):
            current += value
            if current == total:
                ans = value
                break
            total -= value
        return ans

Explain

该题解的整体思路是通过迭代找出中枢整数x。首先,计算从1到n的总和total。然后,通过一个循环逐步计算从1到当前值value的累加和current,同时从total中减去当前的value,以此模拟两侧的和。如果在某一点,current等于total,那么这一点就是中枢整数x。如果循环结束后没有找到这样的点,返回-1。

时间复杂度: O(n)

空间复杂度: O(1)

# 定义解决问题的类
class Solution:
    def pivotInteger(self, n: int) -> int:
        # 初始化答案为-1,意味着如果找不到答案将返回-1
        ans, current, total = -1, 0, (1 + n) * n / 2
        # 从1到n遍历
        for value in range(1, n + 1):
            current += value  # 累加当前值到current
            if current == total:  # 如果当前累加和等于总和的一半,找到中枢整数
                ans = value
                break
            total -= value  # 从总和中减去当前值,更新两侧的目标和
        return ans  # 返回结果,可能是中枢整数或-1

Explore

题目中的中枢整数的定义包含该整数本身在内的累加和。这是因为题目要求从1到x的所有整数之和等于从x到n的所有整数之和。因此,x本身被包含在从1到x的累加和中,并且也是计算从x到n的累加和的起始点。

公式(1 + n) * n / 2是等差数列求和的公式。这个公式用于计算从1到n的所有整数的和。在这个公式中,1是首项,n是末项,n是项数。该公式的意义在于快速计算连续整数的总和,无需逐一加总每个数,提高了计算效率。

在循环中,虽然current和total都在同步更新,但设计的逻辑确保只有在某一个特定的value值时current才可能等于total。这是因为每次循环都会先将current增加当前的value,然后比较current和total,之后才将value从total中减掉。因此,只有在current累加到某一点恰好等于原始total减去之前所有value的一半时,current才会等于total。如果没有这样的点,循环结束后返回-1。