有且只有乙個數字不在該陣列中

2021-10-04 05:29:26 字數 1549 閱讀 1843

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

二分查詢突破的關鍵是,如果某個值缺失了,那麼其後面的值求mid就無法與陣列中的mid位置的值對應上。如果是對的,可以對應上,就往後縮小範圍;如果是錯的,往前縮小範圍。

class

solution

(object):

#三種方法

defmissingnumber

(self, nums)

:min=0

max=

len(nums)-1

mid =

(max

+min)//

2while

min<=

max:

if mid != nums[mid]

:max

= mid -

1else

:min

= mid +

1 mid =

(max

+min)//

2return

max+

1

也是二分:這種比較好理解,補全之後,就跟原來的陣列可以對應上,如果是中值之後的缺失,那麼中值肯定可以對應上;如果是中值之前的,那麼缺失值就有可能是中值及之前的值。(繼續縮小範圍)到最後如果不符合判斷條件了,仍然對應不上,那麼就是缺失了最終的中值。

def

missingnumber

(self, nums):if

not nums:

return

min=

0max

=len

(nums)

# 加了乙個,補全

mid =

(max

+min)//

2while

min<

max:

if mid == nums[mid]

:min

= mid +

1else

:max

= mid

mid =

(max

+min)//

2return mid

公式的方法,算總的,依次減去

class

solution

(object):

defmissingnumber

(self, nums)

: n =

len(nums)+1

a =(0

+n-1

)*n/

2for i in

range(0

, n-1)

: a -= nums[i]

return a

乙個陣列中只有兩個數字是只出現一次

乙個陣列中只有兩個陣列是只出現一次的,其他所有數字都是只出現了兩次,找出這兩個數字 首先,我們看到陣列中找只出現一次的數字我們都會想到用異或,但是異或出來的結果是兩個數的異或結果,這就給我們造成無法通過這個異或結果來區分這兩個數.但是這兩個數是不一樣的,這就使得異或結果中必然有1的存在.我們可通過這...

乙個陣列中滿足一定約束連續數字個數

這是乙個型別題,在leetcode中很常見。這裡只是闡述下思想。暴力解法一般是o n2 如果觀察其他大佬的 發現都使用了個異曲同工的解法。使用乙個累積運算的變數s,這個變數累積的運算有具體題來決定。先建立乙個map,一般來說選擇unorder map,這樣查詢某個元素的複雜度是0 1 因為這個演算法...

找出乙個陣列中各個數字出現的次數

看了prime第一章,突發奇想了乙個問題,如何寫乙個演算法去找出乙個陣列中各個數字出現的次數呢?方法一 可以使用我們經常寫的演算法,氣泡排序之類的,首先對陣列進行排序,然後根據prime中第一章的寫法。算出每個數字出現的次數。include include using namespace std i...