1. 程式人生 > >0-n-1中缺失的數字

0-n-1中缺失的數字

題目:一個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0-n-1之內。在範圍0-n-1內的n-1個數字有且只有一個數字不在該陣列中,請找出這個數字。

方法一:

先用公式n(n-1)/2求出數字0-n-1的所有數字之和,記為s1.接著求出陣列中所有數字的和,記為s2.那個不在陣列中的數字就是s1-s2.這種解法需要O(n)的時間求解陣列中所有數字的和。顯然,該解法沒有有效利用陣列是遞增排序的這一特點。

方法二:

如果中間元素的值和下標相等,那麼下一輪查詢只需要查詢右半邊;如果中間元素的值和下標不相等,並且它前面一個元素和它的下標相等,這意味著這個中間的數字正好是第一個值和下標不相等的元素,它的下標就是在陣列中不存在的數字;如果中間元素的值和下標不相等,並且它前面一個元素和它的下標不相等,這意味著下一輪查詢我們只需要在左半邊查詢即可。

int GetMissingNumber(const int* numbers, int length)
{
    if(numbers == nullptr || length <= 0)
        return -1;

    int left = 0;
    int right = length - 1;
    while(left <= right)
    {
        int middle = (right + left) >> 1;
        if(numbers[middle] != middle)
        {
            if(middle == 0 || numbers[middle - 1] == middle - 1)
                return middle;
            right = middle - 1;
        }
        else
            left = middle + 1;
    }

    if(left == length)
        return length;

    // 無效的輸入,比如陣列不是按要求排序的,
    // 或者有數字不在0到n-1範圍之內
    return -1;
}

相關推薦

0-n-1缺失數字

題目:一個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0-n-1之內。在範圍0-n-1內的n-1個數字有且只有一個數字不在該陣列中,請找出這個數字。 方法一: 先用公式n(n-1)/2求出數字0-n-1的所有數字之和,記為s1.接著求出陣列中所有

0~n-1缺失數字

一個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍為0~n-1之內。這n個數字中有且只有一個數字不在該陣列中,請找出這個數字。import java.util.Scanner; public class Lacknumber { public st

**劍指offer-70-53 0-n-1缺失數字

如果原來的陣列無序,那麼hash O(n)https://www.lintcode.com/problem/missing-number/descriptionclass Solution { public: /** * @param nums: An ar

劍指offer python版 0n-1缺失數字

n) style pri bsp pytho += def clas python def aa(nums,n): for i in range(n): if i ==nums[i]: i +=1 else:

【Java】 劍指offer(53-2) 0n-1缺失數字 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集

  本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集   題目   一個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0到n-1之內。在範圍0到n-1的n個數字中有且只有一個數字不在該陣列中,請找

劍指Offer 0n-1缺失數字

題目: 一個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0到n-1之內。 在範圍0到n-1的n個數字中有且只有一個數字不在該陣列中,請找出這個數字。 樣例 輸入:[0,1,2,4] 輸出:3 解答: 這道題要注意一種情況,即缺失的數字為n-1,如 [0,

面試題53(二):0n-1缺失數字

一、題目 一個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0到n-1之內。在範圍0到n-1的n個數字中有且只有一個數字不在該陣列中,請找出這個數字。 二、關鍵 三、解釋 1.解題思想:基於二分查詢的思想來查詢,如果中間元素的值和下標相等,那麼

劍指Offer-題53(二)(Java版):0n-1缺失數字

參考自:《劍指Offer——名企面試官精講典型程式設計題》 題目:0到n-1中缺失的數字 一個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0到n-1之內。在範圍0到n-1的

給定陣列a[0:n-1]試設計一個演算法,在最壞情況下用[3n/2 -2 ] 次比較找出a[0:n-1]元素的最大值和最小值;教材2-15

給定陣列a[0:n-1]試設計一個演算法,在最壞情況下用[3n/2 -2 ] 次比較找出a[0:n-1]中元素的最大值和最小值; 解:要求對於陣列用小於【3n/2-2】的比較次數找到兩個最值 可以用陣列第一個元素來初始化max,min 然後遍歷陣列,分別和max,min比較,一遍就可以找

找出長度為n的陣列重複的一個數字(數字範圍在0~n-1) 不採用hashmap

要求不採用hashmap public static void main(String[] args) { int[] nums = { 1, 2, 4, 3, 0 }; System.out.println(findDuplicate(nums)); Arrays.stream(num

找出長度為n的數組重復的一個數字(數字範圍在0~n-1) 不采用hashmap

static 一個 str for each light println 循環 pub 要求不采用hashmap public static void main(String[] args) { int[] nums = { 1, 2, 4, 3, 0 }; S

0n-1隨機等概率輸出m個不重複的數

題目描述 假設n遠大於m,程式設計實現從0到n-1中隨機等概率的輸出m個不重複的數。 void knuth(int n,int m) { srand((unsigned int)time(0

VS2015 c++程序單元測試初探——從01所遇到的錯誤和歷程

ima 資料 因此 開頭 完成 數字 style debug unit 實現過程 一開始對單元測試這個東西感覺很恐懼,在看過雪晴的博客後,覺得自己可以試試學學,找到了一篇博客,地址: VS2015安裝與C++進行簡單單元測試 前面的建立和初始化都比較easy,但很快遇到了一

一個大小為n的陣列,裡面的數都屬於範圍[0, n-1],有不確定的重複元素,找到至少一個重複元素,要求O(1)空間和O(n)時間

轉自:點選開啟連結 這個題目要求用O(n)的時間複雜度,這意味著只能遍歷陣列一次。同時還要尋找重複元素,很容易想到建立雜湊表來完成,遍歷陣列時將每個元素對映到雜湊表中,如果雜湊表中已經存在這個元素則說明這就是個重複元素。因此直接使用C++ STL中的hash_set(參見《STL系列之六 

【演算法】氣泡排序(從小到大) 排序範圍(0~n-1)n為陣列元素個數

  今天要談的是基本排序演算法中的氣泡排序。除了氣泡排序,基本排序演算法還包括:選擇排序、插入排序。   插入排序演算法的思想也是很簡單的,它把排序過程模擬成了從水底冒氣泡的過程。一趟排序過程結束後,

C++ 對n個互不相同且均在0n-1整數排序

#include <bits/stdc++.h> #define MaxSize 100 #define ArrayLen(array) sizeof(array)/sizeof(array[0]) #define Type template<class T> /* *

一個數組a[0...n-1],求a[i]-a[j]的最大值,其中i>j

其實這道題有O(n)的方法。 第一種方法: 左往右求下標1到 k - 1 的最大值MAX右往左求 下標k到n -1 的最小值MIN 對於每個k都有一個MAX - MIN的值,最後求這個值的最大值即可。 比如4 5 2 6 3 1 MAX 4 4 2 2 2 MIN 1 3

【Python】給定一個數組A[0,…,n-1],求A的連續子陣列,使得該子陣列的和最大

最大子陣列 給定一個數組A[0,…,n-1],求A的連續子陣列,使得該子陣列的和最大。 例如陣列: 1, -2, 3, 10, -4, 7, 2, -5 最大子陣列:3, 10, -4, 7, 2 演算法分析 定義:字首和sum[i

編寫一個遞迴模板函式,確定元素x是否屬於陣列a[0:n-1]

利用pos記錄遞迴的層數,當遞迴到第n + 1層(也就是到了判斷x == a[n]時)返回false C++程式碼如下: #include <bits/stdc++.h> // 萬能標頭檔案(注意:POJ上無法使用) using namespace st