本文共 852 字,大约阅读时间需要 2 分钟。
要解决的问题是从0到n这n+1个数中选择n个数,组成一个有序数组,然后找出缺失的那个数。目标是尽可能让时间复杂度O(n)最小。
分析过程:
理解问题:给定一个长度为n的数组,该数组包含从0到n中选择的n个数。由于总共有n+1个数,数组中必然缺少一个数。我们需要找到这个缺失的数。
求和方法:计算数组的总和,然后比较它与0到n的总和的差异。0到n的总和可以通过公式n*(n+1)/2计算得出。假设数组的总和为sum,那么缺失的数即为n*(n+1)/2 - sum。
时间复杂度:该方法的时间复杂度为O(n),因为只需要遍历数组一次求和。
解决方法代码:
public class 缺失的数字 { public int solve(int[] a) { int sum = 0; int n = a.length; for (int i = 0; i < n; i++) { if (sum == a[i]) { sum++; } else { break; } } return sum; }} 代码解释:
示例测试:
@Testpublic void test() { int i = solve(new int[]{0, 1, 2, 3, 4, 5, 7}); System.out.println(i);} 输出结果:6
这个方法通过一次遍历数组,高效地找到了缺失的数,时间复杂度为O(n),满足题目要求。
转载地址:http://alhfk.baihongyu.com/