力扣刷題記錄05

2021-10-09 07:47:07 字數 3056 閱讀 1527

題目分類 : 二分查詢

時間 :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

有幾天沒有寫力扣了,這幾天事情實在有點多。聽了幾場就業的經驗分享,仔細想了一下自己的情況,決定放棄考研,去找個工作了。目標 寒假好好學習 春天找個好點的實習 秋招找個好點的工作。加油吧 後面刷力扣會多做點題目,每天兩個簡單題找手感。這個題目沒什麼說的,就是幾次遍歷。第一次算出所有元素和,然後存下來元...