題目分類 : 二分查詢
時間 :2020-09-09
題目一 : 兩數之和||
兩數之和 ii - 輸入有序陣列
給定乙個已按照公升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。
函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。
說明:返回的下標值(index1 和 index2)不是從零開始的。
你可以假設每個輸入只對應唯一的答案,而且你不可以重複使用相同的元素。
示例:輸入: numbers = [2, 7, 11, 15], target = 9
輸出: [1,2]
解釋: 2 與 7 之和等於目標數 9 。因此 index1 = 1, index2 = 2 。
思路
解法一 :雜湊表法
雜湊表法非常簡單,有乙個小竅門可以對演算法進行小優化,讓程式在遍歷完一次陣列後就得出答案。竅門就是小改以下雜湊函式,把target與該元素的差作為key值寫入雜湊表。
var
twosum0
=function
(numbers, target)
;for
(let i =
0; i < numbers.length; i++)}
else
else}}
};
解法二 :二分查詢
因為是有序陣列,可以用二分查詢替代普通遍歷尋找是否存在某個特定元素。
**
var
searchnumber
=function
(num, i)
if(numbers[mid]
< num)
if(numbers[mid]
== num)}}
for(
let i =
0; i < numbers.length; i++)}
else
}}
題目二 :硬幣問題
你總共有 n 枚硬幣,你需要將它們擺成乙個階梯形狀,第 k 行就必須正好有 k 枚硬幣。
給定乙個數字 n,找出可形成完整階梯行的總行數。
n 是乙個非負整數,並且在32位有符號整型的範圍內。
示例 1:
n = 5
硬幣可排列成以下幾行:
¤¤ ¤
¤ ¤因為第三行不完整,所以返回2.
示例 2:
n = 8
硬幣可排列成以下幾行:
¤¤ ¤
¤ ¤ ¤
¤ ¤
思路
做這道題之前我們應該回憶一下,利用二分查詢求x的平方根的題目。利用二分查詢求平方根的關鍵在於,在乙個[1,2,3,4…x]的陣列裡,找到乙個n,使得n的平方小於x且n+1的平方大於x,n即為所求。硬幣問題與該問題相似,唯一的不同在於硬幣排成的等差數列的求和方式與平方不同
**
//定義乙個函式,直接獲取n列硬幣需要的硬幣數目
if(n ==1)
return1;
if(n ==0)
return0;
varcoinscount
=function
(m)for
(let i =
0; i < n; i++
)else}if
(coinscount
(mid)
> n)if(
coinscount
(mid)
== n)
}}
題目三 :方陣戰鬥力
給你乙個大小為 m * n 的方陣 mat,方陣由若干軍人和平民組成,分別用 1 和 0 表示。
請你返回方陣中戰鬥力最弱的 k 行的索引,按從最弱到最強排序。
如果第 i 行的軍人數量少於第 j 行,或者兩行軍人數量相同但 i 小於 j,那麼我們認為第 i 行的戰鬥力比第 j 行弱。
軍人 總是 排在一行中的靠前位置,也就是說 1 總是出現在 0 之前。
示例 1:
輸入:mat =
[[1,1,0,0,0],
[1,1,1,1,0],
[1,0,0,0,0],
[1,1,0,0,0],
[1,1,1,1,1]],
k = 3
輸出:[2,0,3]
解釋:每行中的軍人數目:
行 0 -> 2
行 1 -> 4
行 2 -> 1
行 3 -> 2
行 4 -> 5
從最弱到最強對這些行排序後得到 [2,0,3,1,4]
思路
由於每一列方陣中,1總是出現在0前面,因此可看作乙個有序陣列。使用二分查詢可以找到陣列中的第乙個0,便可得到該列的戰鬥力。
步驟
使用二分查詢,查出每一行的戰鬥力,並將其同方陣序號一起推入乙個新陣列中
根據戰鬥力對陣列進行排列
將陣列前k項的元素中的序號輸出
**
var
kweakestrows
=function
(mat, k)
else}if
(nums[mid]==1
)else}}
}for
(let i =
0; i < mat.length; i++
) countarr.
sort
((a, b)
=>
)for
(let i =
0; i <= k; i++
)return res;
};
力扣刷題記錄2
第一題是每日一題的簡單題。需要記的並不多,一是用迭代器對vector的一些基本操作。可以參考這裡 for vector iterator iter num.begin iter num.end iter 另外是快排的思想。這種思想實用性很廣,即使不需要排序,在找出最大的k個數,對陣列進行分割 以中間...
力扣刷題記錄10
三角形的最大周長 看到這個題目,我想到了排序後從最大的中挑選,但遇到了點困難,一方面是無法記錄哪個是最大的點,這樣每次都要判斷。另一方面是根據題目要求,每個數只能用一次,要記錄下當前哪些是已經被使用了的。看到題解之後感覺自己是個智障。class solution return0 下次貪心時候也要動動...
力扣刷題記錄11
有幾天沒有寫力扣了,這幾天事情實在有點多。聽了幾場就業的經驗分享,仔細想了一下自己的情況,決定放棄考研,去找個工作了。目標 寒假好好學習 春天找個好點的實習 秋招找個好點的工作。加油吧 後面刷力扣會多做點題目,每天兩個簡單題找手感。這個題目沒什麼說的,就是幾次遍歷。第一次算出所有元素和,然後存下來元...