1. 程式人生 > >第八週 LeetCode

第八週 LeetCode

週一作業

標籤為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