正數陣列的最小不可組成和-高階問題
給定乙個正數陣列arr,其中所有的值都為整數,以下是最小不可組成和的概念
請寫函式返回正數陣列arr的最小不可組成和
保證1一定出現過!
[要求]
時間複雜度為o(n
logn
)o(nlogn)
o(nlog
n),額外空間複雜度為o(1
)o(1)
o(1)
輸入描述:
第一行乙個整數n,表示陣列長度。
接下來一行n個整數表示陣列內的元素。
輸出描述:
輸出乙個整數表示陣列的最小不可組成和
示例1輸入
3
1 2 5
輸出4
說明3 = 1 + 2
示例2
輸入
5
1 2 3 4 5
輸出16
備註:
1 ⩽n
⩽105
1 \leqslant n \leqslant 10^5
1⩽n⩽1051⩽
arri
⩽109
1 \leqslant arr_i \leqslant 10^9
1⩽arri
⩽10
9題解:
相比於上一題 正數陣列的最小不可組成和 ,這題多了乙個條件:1一定出現。於是此題可以進行優化:
簡要證明:
假設當前遍歷到位置 i,若要湊出區間 [1, arr[i] + range],我們現在需要湊出來的是區間 [range+1, range+arr[i]],假設 arr[0…i-1] 可以湊出 range - x ,則:
若 arr[i] > range + 1,則 x = arr[i] - 1 > range ,arr[0…i-1] 肯定無法湊出來(最大值為 range) ,而後面不會出現 range + 1 ,所以 range + 1 就是答案。
**:
#include
#include
using
namespace std;
const
int n =
100000
;int n;
int a[n]
;int
main
(void
)return0*
printf
("%ld\n"
, range +1)
;}
正數陣列的最小不可組成和
給定乙個正整數陣列arr,其中所有的值都為整數,以下是最小不接組成和的概念 arr 1,2,3,4 返回11 arr 2,3,4 返回7 public intbaoli intarr for int i min 1 i integer.max value i return0 public void ...
正數陣列的最小不可組成和
題目 給定乙個正數陣列arr,其中所有的值都是整數,以下是最小不可組成和的概念 把arr每個子集內的所有元素加起來會出現很多值,其中最小的記為min,最大的記為max。在區間 min,max 上,如果有數不可以被arr某乙個子集相加得到,那麼其中最小的那個數就是arr的最小不可組成和。在區間 min...
正數陣列的最小不可組成和
正數陣列的最小不可組成和 給定乙個正數陣列arr,其中所有的值都為整數,以下是最小不可組成和的概念 請寫函式返回正數陣列arr的最小不可組成和 時間複雜度為o n i 1nar ri o n times sum n arr i o n i 1n arri 額外空間複雜度為o i 1n arri o ...