leetcode day16 array partition

题目描述:给定一个数组,每两个数为一pair,选出一对中最小的数,进行求和,求出最大的和
思路:
这个题的思路其实有点简单,就是从小到大排序,最近邻的两个成为一组,则最后求出来的和为最大和,于是我想到了法1
1、先对数组进行排序,秩为单数的求和,这种方法的效率有点低就是,emm问题出在哪里呢
2、很巧妙的一种方法:

class Solution(object):
    def arrayPairSum(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        sum = 0
        odd = 1
        new_exsist = [0]*20001
        for i in nums:
            new_exsist[i+10000] += 1
        for j in range(len(new_exsist)):
            while new_exsist[j] > 0:
                if odd == 1:
                    sum += (j-10000)
                new_exsist[j] -= 1
                odd = -odd
        return sum

这种方法的巧妙之处:
1、遍历的同时已经排序好了
2、再次遍历已排序好的数目,总的时间复杂度为n

小结:
这种巧妙的方法,有点点像之前做过的一道题,find all numbers disappear, 都是利用了值与秩大小关系的巧妙联系。这个可能还得再磨磨

猜你喜欢

转载自blog.csdn.net/qq_39029148/article/details/88822496