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

0~n-1中缺失的數字

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

import java.util.Scanner;

public class Lacknumber {
	public static void main(String args[]){
		Scanner sc=new Scanner(System.in);
		int number=sc.nextInt();
		int [] array=new int[number-1];
		for(int i=0;i<number-1;i++){
			array[i]=sc.nextInt();
		}
		System.out.println(FindNumber2(number,array));
	}
	//Solution1
	private static int FindNumber(int n,int [] array){
		if(array.length==0||n==0)
			return -1;
		int a[]=new int[n];
		int temp=0;
		for(int i=0;i<n;i++){
			a[i]=-1;
		}
		for(int i=0;i<array.length;i++){
			int index=array[i];
			a[index]=index;
		}
		for(int i=0;i<n;i++){
			if(a[i]==-1){
				temp=i;
				break;
			}
		}
		return temp;
	}
	//Solution2
	private static int FindNumber1(int n,int [] array){
		if(array.length==0||n==0)
			return -1;
		int sum1=n*(n-1)/2;
		int sum2=0;
		for(int i=0;i<array.length;i++){
			sum2+=array[i];
		}
		int temp=sum1-sum2;
		return temp;
		
	}
	//Solution3:利用二分查詢,當看到題目中告知有序時,便可以考慮使用二分查詢
	private static int FindNumber2(int n, int[] array){
		if(array.length==0||n==0)
			return -1;
		int temp=0;
		int low=0;
		int high=array.length-1;
		while(low<=high){
			int mid=(low+high)/2;
			if(array[mid]!=mid){
				if(mid==0||array[mid-1]==mid-1)
					temp=mid;
				high=mid-1;
			}
			else{
				low=mid+1;
			}
			if(low==array.length)
				return array.length;
		}
		return temp;
	}
}

同類型題目舉例:

陣列中數值和下標相等的元素

假設一個單調遞增的數組裡的每一個元素都是證書並且是唯一的。請找出陣列中任意一個等於其下標的元素。(觀察發現,陣列遞增,可以使用二分查詢,時間複雜度為O(lgn))。

public class Solution {
	public static void main(String args[]){
		int [] array={-3,-1,1,3,5};
		System.out.println(FindNumber(array));
	}
	private static int FindNumber(int [] array){
		if(array.length==0)
			return -1;
		int low=0;
		int high=array.length-1;
		while(low<=high){
			int mid=(low+high)>>1;
		    if(array[mid]>mid){
		    	high=mid-1;
		    }
		    else if(array[mid]<mid){
		    	low=mid+1;
		    }
		    else
		    	return mid;
		}
		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