python_排序技巧

1.根据身高,体重,编号从小到大排序

eg:

编号:[1,2,3,4]

身高:[100,90,110,100]

体重:[30,35,50,30]

输出:2 1 4 3

def sort_student(h,w):
    dict_ = {}
    l = len(h)
    for i in range(l):
        t = (h[i],w[i])
        dict_[t]=dict_.get(t,[])+[i]
    ret = []
    for k in sorted(dict_.keys()):
        ret.extend(sorted(dict_[k]))
    return ret
    

2.435. 无重叠区间

class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        l = len(intervals)
        if l == 0:
            return 0
        intervals = sorted(intervals,key=lambda x:x[1])
        ret = l
        c = 1
        right = intervals[0][1]
        for i in range(1,l):
            if intervals[i][0] >= right:
                c+=1
                right = intervals[i][1]
        return ret - c

备注:区间元素排序示例全集

# 1.数组第一个元素升序,第二个元素也升序(sort/sorted默认行为)
arr = [[1,2],[1,1],[2,2],[2,5],[-1,3],[-2,5]]
arr.sort()
print(arr)
'''
[[-2, 5], [-1, 3], [1, 1], [1, 2], [2, 2], [2, 5]]
'''
arr = [[1,2],[1,1],[2,2],[2,5],[-1,3],[-2,5]]
arr = sorted(arr)
print(arr)
'''
[[-2, 5], [-1, 3], [1, 1], [1, 2], [2, 2], [2, 5]]
'''


# 2.reverse正好相反
arr = [[1,2],[1,1],[2,2],[2,5],[-1,3],[-2,5]]
arr = sorted(arr, reverse=True)
print(arr)
'''
[[2, 5], [2, 2], [1, 2], [1, 1], [-1, 3], [-2, 5]]
'''


# 3.数组第一个元素升序,第二个元素降序
arr = [[-52, 31], [-73, -26], [66, 97], [-65, -11], [-31, 49], [66, 98], [-63, 2]]
arr.sort(key=lambda x: (x[0], -x[1]))
print(arr)
'''
[[-73, -26], [-65, -11], [-63, 2], [-52, 31], [-31, 49], [66, 98], [66, 97]]
'''

arr = [[-52, 31], [-73, -26], [66, 97], [-65, -11], [-31, 49], [66, 98], [-63, 2]]
arr = sorted(arr, key=lambda x: (x[0], -x[1]))
print(arr)
'''
[[-73, -26], [-65, -11], [-63, 2], [-52, 31], [-31, 49], [66, 98], [66, 97]]
'''


# 4.数组第二个元素升序
arr = [[-52, 31], [-73, -26], [82, 97], [-65, -11], [-31, 49], [66, 98], [-63, 2]]
arr.sort(key=lambda x: x[1])
print(arr)
'''
[[-73, -26], [-65, -11], [-63, 2], [-52, 31], [-31, 49], [82, 97], [66, 98]]
'''

arr = [[-52, 31], [-73, -26], [82, 97], [-65, -11], [-31, 49], [66, 98], [-63, 2]]
arr = sorted(arr, key=lambda x: x[1])
print(arr)
'''
[[-73, -26], [-65, -11], [-63, 2], [-52, 31], [-31, 49], [82, 97], [66, 98]]
'''


# 5.数组第二个元素降序
arr = [[-52, 31], [-73, -26], [82, 97], [-65, -11], [-31, 49], [66, 98], [-63, 2]]
arr.sort(key=lambda x: -x[1])
print(arr)
'''
[[66, 98], [82, 97], [-31, 49], [-52, 31], [-63, 2], [-65, -11], [-73, -26]]
'''

arr = [[-52, 31], [-73, -26], [82, 97], [-65, -11], [-31, 49], [66, 98], [-63, 2]]
arr = sorted(arr, key=lambda x: -x[1])
print(arr)
'''
[[66, 98], [82, 97], [-31, 49], [-52, 31], [-63, 2], [-65, -11], [-73, -26]]
'''

3.452. 用最少数量的箭引爆气球

与435相似,使用第二个元素升序排序,只要第一个元素<=right,则必有重合,反之则无重合。

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        l = len(points)
        if l<=1:
            return l
        points = sorted(points, key=lambda x:x[1])
        ret = 1
        right = points[0][1]
        for i in range(1,l):
            if points[i][0] > right:
                right = points[i][1]
                ret+=1
        return ret

4.56. 合并区间

备注:主要还是确定排序规则和l.r的更新规则

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        l = len(intervals)
        if l <= 1:
            return intervals
        ret = []
        intervals = sorted(intervals)
        left = intervals[0][0]
        right = intervals[0][1]
        for i in range(1,l):
            if intervals[i][0] > right:
                ret.append([left,right])
                left = intervals[i][0]
                right = intervals[i][1]
            else:
                left = min(left,intervals[i][0])
                right = max(right,intervals[i][1])
        ret.append([left,right])
        return ret

5934. 找到和最大的长度为 K 的子序列

class Solution:
    def maxSubsequence(self, nums: List[int], k: int) -> List[int]:
        dict_ = {}
        for i,v in enumerate(nums):
            dict_[i] = v
        a = sorted(dict_.items(), key=lambda d:-d[1])
        pos = []
        for i in range(k):
            pos.append(a[i][0])
        ret = []
        for i in sorted(pos):
            ret.append(nums[i])
        return ret

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值