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
        
        
        
        
        
        
        
        
       

猜你喜欢

转载自blog.csdn.net/bengepai/article/details/82316217