版权声明:此文章为许诗宇所写,如需转载,请写下转载文章的地址 https://blog.csdn.net/xushiyu1996818/article/details/83375692
题目及测试
package pid268;
/* 缺失数字
给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。
示例 1:
输入: [3,0,1]
输出: 2
示例 2:
输入: [9,6,4,2,3,5,7,0,1]
输出: 8
说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?
*/
public class main {
public static void main(String[] args) {
int[][] testTable = {{3,0,1},{9,6,4,2,3,5,7,0,1},{0,1,2,3},{1,2,3},{0}};
for(int i=0;i<testTable.length;i++){
test(testTable[i]);
}
}
private static void test(int[] ito) {
Solution solution = new Solution();
long begin = System.currentTimeMillis();
System.out.println("ito= ");
for(int i=0;i<ito.length;i++){
System.out.print(ito[i]+" ");
}
System.out.println();
int rtn;
rtn=solution.missingNumber(ito);//执行程序
long end = System.currentTimeMillis();
System.out.println("rtn="+rtn);
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
解法1(成功,2ms,较快)
先遍历一遍得到max值
然后求得0-max的和 用公式=sum
用sum减去所有的数
如果不为0,则必为这个数
如果为0
有两种可能
012 和12
第一种结果为 3 第二种 0
如果length=3不与max相同,则为max+1
如果length=max 则为0
package pid268;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int missingNumber(int[] nums) {
//额外情况可能性
//012 3
//12 0
int max=0;
int sum=0;
int length=nums.length;
if(length==0){
return 0;
}
for(int i=0;i<length;i++){
if(nums[i]>max){
max=nums[i];
}
}
sum=(1+max)*max/2;
for(int i=0;i<length;i++){
sum=sum-nums[i];
}
if(sum==0&&max!=length){
return max+1;
}
else{
return sum;
}
}
}
解法2(别人的)
可以发现,总共n个,长度n-1,所以真正的max必为length,不用遍历求max,而且不在中间用公式求和,直接+i-num[i]即可
public int missingNumber(int[] nums) {
// i的范围是0~nums.length-1,算上nums.length(N)就是0~N所有数字
int res = nums.length;
for (int i = 0; i < nums.length; i++) {
res += (i - nums[i]);
}
return res;
}