第166場周賽實錄(變形二分法)

2021-10-01 10:20:28 字數 4054 閱讀 8014

難度:簡單

給你乙個整數 n,請你幫忙計算並返回該整數「各位數字之積」與「各位數字之和」的差。

示例 1:

輸入:n = 234

輸出:15

解釋:各位數之積 = 2 * 3 * 4 = 24

各位數之和 = 2 + 3 + 4 = 9

結果 = 24 - 9 = 15

示例 2:

輸入:n = 4421

輸出:21

解釋:各位數之積 = 4 * 4 * 2 * 1 = 32

各位數之和 = 4 + 4 + 2 + 1 = 11

結果 = 32 - 11 = 21

解決方案:

class

solution

:def

subtractproductandsum

(self, n:

int)

->

int:

multi =

1 add =

0 n_str =

str(n)

for i in n_str:

multi = multi *

int(i)

add +=

int(i)

return multi-add

執行用時

記憶體消耗

語言32 ms

12.7 mb

python3

難度:中等

有 n 位使用者參加活動,他們的 id 從 0 到 n - 1,每位使用者都 恰好 屬於某一使用者組。給你乙個長度為 n 的陣列 groupsizes,其中包含每位使用者所處的使用者組的大小,請你返回使用者分組情況(存在的使用者組以及每個組中使用者的 id)。

你可以任何順序返回解決方案,id 的順序也不受限制。此外,題目給出的資料保證至少存在一種解決方案。

示例 1:

輸入:groupsizes = [3,3,3,3,3,1,3]

輸出:[[5],[0,1,2],[3,4,6]]

解釋:其他可能的解決方案有 [[2,1,6],[5],[0,4,3]] 和 [[5],[0,6,2],[4,3,1]]。

示例 2:

輸入:groupsizes = [2,1,3,3,3,2]

輸出:[[1],[0,5],[2,3,4]]

解決方案:

class

solution

:def

groupthepeople

(self, groupsizes: list[

int])-

> list[list[

int]]:

ans =

res =

dict()

for i in

range

(len

(groupsizes)):

ifnot res.get(groupsizes[i]):

res[groupsizes[i]]=

[i]else

: res[groupsizes[i]

]if res.get(groupsizes[i]

)and

len(res[groupsizes[i]])

== groupsizes[i]:)

)return ans

執行用時

記憶體消耗

語言88 ms

12.8 mb

python3

難度:中等

給你乙個整數陣列 nums 和乙個正整數 threshold ,你需要選擇乙個正整數作為除數,然後將陣列裡每個數都除以它,並對除法結果求和。

請你找出能夠使上述結果小於等於閾值 threshold 的除數中 最小 的那個。

每個數除以除數後都向上取整,比方說 7/3 = 3 , 10/2 = 5 。

題目保證一定有解。

示例 1:

輸入:nums = [1,2,5,9], threshold = 6

輸出:5

解釋:如果除數為 1 ,我們可以得到和為 17 (1+2+5+9)。

如果除數為 4 ,我們可以得到和為 7 (1+1+2+3) 。如果除數為 5 ,和為 5 (1+1+1+2)。

示例 2:

輸入:nums = [2,3,5,7,11], threshold = 11

輸出:3

示例 3:

輸入:nums = [19], threshold = 5

輸出:4

解決方案1:

import math

class

solution

:def

computer_sum

(self, nums, d)

: ans =

0for i in nums:

ans += math.ceil(i / d)

# print(ans)

return ans

defsmallestdivisor

(self, nums, threshold)

: max_n =

max(nums)

min_n =

1 mid =

(max_n + min_n)//2

while mid != max_n and mid != min_n:

if self.computer_sum(nums, mid)

<= threshold:

if self.computer_sum(nums, mid-1)

> threshold:

return mid

max_n = mid

mid =

(max_n + min_n)//2

else

: min_n = mid

mid =

(min_n + max_n)//2

return mid

執行用時

記憶體消耗

語言676 ms

18.2 mb

python3

解決方案2(來自網路,簡化了上個方法):

class

solution

:def

smallestdivisor

(self, nums: list[

int]

, threshold:

int)

->

int:

""" 簡單二分

時間複雜度: nums.length*log(max(nums)) = 17*5*10^4

:param nums:

:param threshold:

:return:

"""l, r =1,

max(nums)

while

(l < r)

: mid =

(l + r)

>>

1# 小於等於閾值, 說明 答案不是在mid的左邊就是midif(

sum(math.ceil(x/mid)

for x in nums)

<= threshold)

: r = mid

# 大於閾值, 答案在mid右邊

else

: l = mid +

1return r

執行用時

記憶體消耗

語言512 ms

18.2 mb

python3

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...

python二分法查詢 Python 二分法查詢

二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...

第k大數 二分法

時間限制 10 sec 記憶體限制 128 mb 有兩個序列a,b,它們的長度分別為n和m,那麼將兩個序列中的元素對應相乘後得到的n m個元素從大到小排列後的第k個元素是什麼?輸入的第一行為乙個正整數t t 10 代表一共有t組測試資料。每組測試資料的第一行有三個正整數n,m和k 1 n,m 100...