这是第八篇算法,力扣链接
给你一个正整数
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 解释:可以证明不存在满足题目要求的整数。
设中枢数为n,中枢数满足
显然,暴力法模拟可以解决问题,相比于暴力法会有一个优化的解法
方法一:哈希表暴力法
构建一个哈希表记录所有前X项的和,然后选出符合预期的值
func pivotInteger(n int) int {
if n == 1 {
return 1
}
sumTable := make([]int, n+1)
for i := 0; i <= n; i++ {
if i == 0 {
continue
}
sumTable[i] = sumTable[i-1] + i
}
for i, sum := range sumTable {
if i == 0 {
continue
}
if sumTable[n]-sumTable[i-1] == sum {
return i
}
}
return -1
}
方法二:数学归纳法
前n项和公式为:
1到n项和公式为:
两式相等:
化简:
代码如下:
func pivotInteger(n int) int {
temp := (n * n + n) / 2
x := int(math.Sqrt(float64(temp)))
if x * x == t {
return x
}
return -1
}