Skip to content

Latest commit

 

History

History
231 lines (174 loc) · 5.37 KB

File metadata and controls

231 lines (174 loc) · 5.37 KB
comments difficulty edit_url rating source tags
true
简单
1244
第 11 场双周赛 Q1
数组
数学

English Version

题目描述

在某个数组 arr 中,值符合等差数列的数值规律:在 0 <= i < arr.length - 1 的前提下,arr[i+1] - arr[i] 的值都相等。

我们会从该数组中删除一个 既不是第一个  不是最后一个的值,得到一个新的数组  arr

给你这个缺值的数组 arr,返回 被删除的那个数

 

示例 1:

输入:arr = [5,7,11,13]
输出:9
解释:原来的数组是 [5,7,9,11,13]。

示例 2:

输入:arr = [15,13,12]
输出:14
解释:原来的数组是 [15,14,13,12]。

 

提示:

  • 3 <= arr.length <= 1000
  • 0 <= arr[i] <= 105
  • 给定的数组 保证 是一个有效的数组。

解法

方法一:等差数列求和公式

等差数列求和公式为 $\frac{(a_1 + a_n)n}{2}$,其中 $n$ 为等差数列的项数,等差数列的首项为 $a_1$,末项为 $a_n$

因为题目中给出的数组是一个等差数列,且缺失了一个数,所以数组的项数为 $n + 1$,首项为 $a_1$,末项为 $a_n$,则数组的和为 $\frac{(a_1 + a_n)(n + 1)}{2}$

因此,缺失的数为 $\frac{(a_1 + a_n)(n + 1)}{2} - \sum_{i = 0}^n a_i$

时间复杂度 $O(n)$,其中 $n$ 为数组的长度。空间复杂度 $O(1)$

Python3

class Solution:
    def missingNumber(self, arr: List[int]) -> int:
        return (arr[0] + arr[-1]) * (len(arr) + 1) // 2 - sum(arr)

Java

class Solution {
    public int missingNumber(int[] arr) {
        int n = arr.length;
        int x = (arr[0] + arr[n - 1]) * (n + 1) / 2;
        int y = Arrays.stream(arr).sum();
        return x - y;
    }
}

C++

class Solution {
public:
    int missingNumber(vector<int>& arr) {
        int n = arr.size();
        int x = (arr[0] + arr[n - 1]) * (n + 1) / 2;
        int y = accumulate(arr.begin(), arr.end(), 0);
        return x - y;
    }
};

Go

func missingNumber(arr []int) int {
	n := len(arr)
	x := (arr[0] + arr[n-1]) * (n + 1) / 2
	y := 0
	for _, v := range arr {
		y += v
	}
	return x - y
}

TypeScript

function missingNumber(arr: number[]): number {
    const x = ((arr[0] + arr.at(-1)!) * (arr.length + 1)) >> 1;
    const y = arr.reduce((acc, cur) => acc + cur, 0);
    return x - y;
}

方法二:求公差 + 遍历

因为题目中给出的数组是一个等差数列,且缺失了一个数,首项为 $a_1$,末项为 $a_n$,那么公差 $d = \frac{a_n - a_1}{n}$

遍历数组,如果 $a_i \neq a_{i - 1} + d$,则返回 $a_{i - 1} + d$

如果遍历完数组都没有找到缺失的数,说明数组的所有数都相等,直接返回数组的第一个数即可。

时间复杂度 $O(n)$,其中 $n$ 为数组的长度。空间复杂度 $O(1)$

Python3

class Solution:
    def missingNumber(self, arr: List[int]) -> int:
        n = len(arr)
        d = (arr[-1] - arr[0]) // n
        for i in range(1, n):
            if arr[i] != arr[i - 1] + d:
                return arr[i - 1] + d
        return arr[0]

Java

class Solution {
    public int missingNumber(int[] arr) {
        int n = arr.length;
        int d = (arr[n - 1] - arr[0]) / n;
        for (int i = 1; i < n; ++i) {
            if (arr[i] != arr[i - 1] + d) {
                return arr[i - 1] + d;
            }
        }
        return arr[0];
    }
}

C++

class Solution {
public:
    int missingNumber(vector<int>& arr) {
        int n = arr.size();
        int d = (arr[n - 1] - arr[0]) / n;
        for (int i = 1; i < n; ++i) {
            if (arr[i] != arr[i - 1] + d) {
                return arr[i - 1] + d;
            }
        }
        return arr[0];
    }
};

Go

func missingNumber(arr []int) int {
	n := len(arr)
	d := (arr[n-1] - arr[0]) / n
	for i := 1; i < n; i++ {
		if arr[i] != arr[i-1]+d {
			return arr[i-1] + d
		}
	}
	return arr[0]
}

TypeScript

function missingNumber(arr: number[]): number {
    const d = ((arr.at(-1)! - arr[0]) / arr.length) | 0;
    for (let i = 1; i < arr.length; ++i) {
        if (arr[i] - arr[i - 1] !== d) {
            return arr[i - 1] + d;
        }
    }
    return arr[0];
}