leetcode-268-缺失數字(missing number)-java
阿新 • • 發佈:2018-10-31
題目及測試
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;
}