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版 0到n-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) 0到n-1中缺失的數字 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集 題目 一個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0到n-1之內。在範圍0到n-1的n個數字中有且只有一個數字不在該陣列中,請找
劍指Offer 0到n-1中缺失的數字
題目: 一個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0到n-1之內。 在範圍0到n-1的n個數字中有且只有一個數字不在該陣列中,請找出這個數字。 樣例 輸入:[0,1,2,4] 輸出:3 解答: 這道題要注意一種情況,即缺失的數字為n-1,如 [0,
面試題53(二):0到n-1中缺失的數字
一、題目 一個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0到n-1之內。在範圍0到n-1的n個數字中有且只有一個數字不在該陣列中,請找出這個數字。 二、關鍵 三、解釋 1.解題思想:基於二分查詢的思想來查詢,如果中間元素的值和下標相等,那麼
劍指Offer-題53(二)(Java版):0到n-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
從0到n-1中隨機等概率輸出m個不重複的數
題目描述 假設n遠大於m,程式設計實現從0到n-1中隨機等概率的輸出m個不重複的數。 void knuth(int n,int m) { srand((unsigned int)time(0
VS2015 c++程序單元測試初探——從0到1中所遇到的錯誤和歷程
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個互不相同且均在0—n-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
面試題3:在一個長度為n的數組裏的所有數字都在0到n-1的範圍內。 數組中某些數字是重復的,但不知道有幾個數字是重復的。也不知道每個數字重復幾次。請找出數組中任意一個重復的數字。 例如,如果輸入長度為7的數組{2,3,1,0,2,5,3},那麽對應的輸出是第一個重復的數字2。
length value 如果 while 返回 sys public ret || package siweifasan_6_5; /** * @Description:在一個長度為n的數組裏的所有數字都在0到n-1的範圍內。 * 數組中某些數字是重復的,