第八週 LeetCode
阿新 • • 發佈:2018-12-06
週一作業
標籤為Array
#561
題目給出2n個整數,要將他們分成n對整數,使得每對整數的較小數之和最大。求這個最大的和是多少。
要讓這個和最大,而每次都選取較小的一個數,那麼就應該讓每組數字的差儘可能小,比如(1,2,3,4)分成(1,2),(3,4)的和是4,而分成(1,3),(2,4)的和是3。這樣就想到可以先對2n個數排序,然後相鄰兩個一組,選取序號小的那個加起來就是最終結果了。
程式碼
class Solution: def arrayPairSum(self, nums): nums.sort() # 排序 sum = 0 for x in range(0, len(nums), 2): # 下標為0,2,4...的求和 sum += nums[x] return sum
週三作業
#36
給定一個9x9的列表表示數獨遊戲的現在情況,判斷這個情況是否符合數獨規則,即每行、每列、每個小宮格是否有重複數字。
判斷每行是否有重複用python來實現很簡單,只需要用count()方法判斷是否有某個數字出現兩次或以上就可以了,因為儲存方式是每行一個列表的形式。那麼對於每列和每個3x3小宮格的情況也可以類似地解決,只需要使用一個新的列表把每列或者每個小宮格的元素新增進去,再使用count()方法就可以了。
程式碼
class Solution: def isValidSudoku(self, board): for i in range(9): # row for x in board[i]: if board[i].count(x) > 1 and x != '.': return False for i in range(9): #column l = [] for j in range(9): l += board[j][i] for x in l: if l.count(x) > 1 and x != '.': return False for i in range(3): for j in range(3): l = [] l += board[3*i][j*3:3*j+3] l += board[3*i+1][j*3:3*j+3] l += board[3*i+2][j*3:3*j+3] for x in l: if l.count(x) > 1 and x != '.': return False return True