劍指offer53題 在排序陣列中查詢數字

2021-10-25 08:01:56 字數 2157 閱讀 7800

問題二:有序陣列中缺失的數字

統計乙個數字在排序陣列**現的次數。

示例 1:

輸入: nums =[5

,7,7

,8,8

,10], target =

8輸出:

2

示例 2:

輸入: nums =[5

,7,7

,8,8

,10], target =

6輸出:

0

解法一:暴力破解,迴圈遍歷遍歷陣列,統計目標值出現的個數,時間複雜度為o(n),n為陣列的長度。

解法二:二分查詢,兩邊擴充套件

由於陣列是有序的,所以我們可以使用二分法找到目標值target,然後向兩邊擴散查詢進行統計(因為陣列是有序的,所以target一定是相鄰在一起的),直到與target的值不相等為止。

解法一**:

public

intsearch

(int

nums,

int target)

return count;

}

解法一提交結果:

解法二**:

public

static

intsearch2

(int

nums,

int target)

}return count;

}

提交結果:

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

示例 1:

輸入:[0

,1,3

]輸出:

2

示例 2:

輸入:[0

,1,2

,3,4

,5,6

,7,9

]輸出:

8

解法一:利用陣列下標判斷由於陣列是從0開始遞增的,所以當第一次出現nums[i]與陣列下標i不對應時,那麼i就是缺少的值。如果整個陣列都對應,那麼缺少的就是n,即陣列的長度。

解法二:二分法,尋找邊界值

用二分法尋找nums[i]與陣列下標i開始不對應的邊界,即可找出缺少的值。

解法一**:

public

intmissingnumber

(int

nums)

//如果陣列是有序遞增的,那麼缺少的是n,即陣列的長度

return nums.length;

}

解法一提交結果:

解法二**:

public

intmissingnumber

(int

nums)

return i;

}

解法二提交結果:

總結:問題二的解法二和解法一相差不大,因為解法乙隻有再最壞的情況下時間複雜度才是o(n)。nums[i]與陣列下標i不相等的情況出現得越靠前解法一的效率就越高,甚至超過解法二。並且解法一再迴圈遍歷的過程中不需要進行計算(相加運算)。從**上看解法一也更簡潔。

劍指Offer 53 在排序陣列中查詢數字

package 劍指offer public class 劍指53 在排序陣列中查詢數字 和數字3,由於3在陣列中出現4次,所以返回結果4 思路 因為陣列是有序的,所以採用二分法查詢,當找到乙個k時,因為可能前面或者後面都有k,如果從當前找的到位置往兩頭開始遍歷,那麼有可能整個陣列為一樣的數,所以時...

劍指Offer 53 在排序陣列中查詢數字

統計乙個數字在排序陣列 現的次數。例 輸入陣列和數字3。由於3在這個陣列 現了4次,輸出4。遍歷陣列統計。時間複雜度 o n 空間複雜度 o 1 遍歷統計沒有利用到這是個排序陣列的資訊。因為是排序陣列,所以需要統計的數字i個數等於i right i left 1。只要找到數字的邊界即可。同時可以利用...

劍指offer 53 在排序陣列中查詢數字

給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。你的演算法時間複雜度必須是 o log n 級別。思路 看到 排列陣列 第一反應就得是二分查詢。但是一般的二分,如果在中點處剛好找到乙個數等於target,那接下來往哪邊走呢?沒辦法判...