leetcode 406

這題雖然最後做出來了,但是花費的時間太多。主要的idea還是比較容易得到的。看到這種題,我的第一直覺肯定就是按照某一行或列元素進行排序。排過序之後再在草稿紙上推推,就大概能得到思路。這裏我們按照第一個元素進行排序,

eg. [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

排序後得到:

[[4,4],[5,0],[5,2],[6,1],[7,0],[7,1]]

我們可以發現第一個元素[4,4]它的位置一定是在第4個位置上,因爲它是最小的,如果在它前面肯定都不小於它,所以它如果不在第四個位置,那麼就不滿足條件。有了這樣的想法,我們就接着來看[5,0],這裏[5,0]應該排在第0個位置,[5,2]應該排在第二個位置,所以我們可以知道每個list正好應該排在除去已經排好的剩餘空位的第n個位置上。

思想大致如上,但是有一些坑,需要特別注意,首先,因爲我是採用一個list來記錄剩餘空位的,通過pop的方式來看剩下空餘的位置(坑點)。注意如果是元素相同的話,要在該元素全部遍歷過之後再pop,比如[5,0],[5,2]如果你在[5,0]的時候就pop了,那麼[5,2]插入的時候其實就是第3個位置了。畫個草圖就應該知道相同的元素要最後一起pop。其次,第二個坑點是在一起pop的時候,indeb是會變的!!!!所以根據index來遍歷進行pop時,需要特別特別小心,前面的pop完全就改變了後面元素的index。

大致看了一下別人的解答,是O(n2)的算法,如果我用數組來記錄空餘位置的話,也應該是這個時間複雜度。同時也能避免後面的坑,主要是因爲後面懶得改了。。。。附代碼:

class Solution:
    def reconstructQueue(self, people):
        """
        :type people: List[List[int]]
        :rtype: List[List[int]]
        """
        if len(people) == 0:
            return []
        result = people.copy()
        loc  = list(range(len(people)))
        people.sort(key=lambda x:(x[0],x[0]))
        value = people[0][0]
        queue = []
        for i in range(len(people)):
            cur_value = people[i][0]
            temp = people[i][1]
            if cur_value != value or i == 0:
                queue.sort()
                index = 0
                for j in queue:
                    loc.pop(j-index)
                    index += 1
                queue=[temp]
                value = cur_value
            else:
                queue.append(people[i][1])
            res_loc = loc[temp]
            result[res_loc] = people[i]
            
        return result
        
        
        
        
        
        
        
        
       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章