問題二:有序陣列中缺失的數字
統計乙個數字在排序陣列**現的次數。示例 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,那接下來往哪邊走呢?沒辦法判...