leetcode笔记|第十三周 排序

第十三周 排序 python对于排序的题真是太偷懒了

242 有效的字母异位词

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        # 统计每个元素出现的次数用Counter()
        return Counter(s)==Counter(t)

922按奇偶排序数组 II

class Solution:
    def sortArrayByParityII(self, A: List[int]) -> List[int]:
        # 笨方法:将元素分为奇数偶数list,然后一边一个放进res
        res = []
        res_odd = []
        res_even = []
        for i in range(len(A)): # 其实可以for a in A:
            if A[i]%2==0:
                res_even.append(A[i])
            else:
                res_odd.append(A[i])
        for i in range(len(res_even)):
            res.append(res_even[i])
            res.append(res_odd[i])
        return res

        # 一遍:双指针,放了之后移到下面位置
        even = 1
        odd = 0 # odd奇数,但是第1个是0,所以“反了”
        res = [-1]*len(A)
        for a in A:
            if a % 2 ==0:
                res[odd] = a
                odd += 2
            else:
                res[even] = a
                even += 2
        return res

1329.将矩阵按对角线排序

class Solution:
    def diagonalSort(self, mat: List[List[int]]) -> List[List[int]]:
        # 思路:把每一对角线都列出list,然后sort()排序以后覆盖mat
        m,n = len(mat),len(mat[0])
        # 第一行和第一列是起点
        start = [(0,0)]+[(i,0) for i in range(m)]+[(0,j) for j in range(n)]
        # 对每个起点都建立sortlist是mat对角线元素的list然后sort()
        for (i,j) in start:
            sortlist = [mat[i+k][j+k] for k in range(min(m,n)) if i+k<m and j+k<n]
            sortlist.sort()
            # sortlist覆盖当前对角线元素值
            for k in range(len(sortlist)):
                mat[i+k][j+k] = sortlist[k]
        return mat

剑指 Offer 45. 把数组排成最小的数

输入[3,30],输出"303"

class Solution:
    def minNumber(self, nums: List[int]) -> str:
        # 法1: python内置函数
        # [3,30]按照3/9和30/99大小排序,得到应该是303不是330
        tmp = sorted(nums, key=lambda x:x/(10**len(str(x))-1))
        # 将list的num按照str拼接
        return "".join(map(str, tmp))

        # 其实应该用快排的
        def fast_sort(l,r):
            if l>=r: return
            i,j = l,r
            while i<j:
                # i,j分别移动到比target=nums[i]大和小的位置,互换
                while i<j and nums[j]+nums[l]>=nums[l]+nums[j]: j-=1
                while i<j and nums[i]+nums[l]<=nums[l]+nums[i]: i+=1
                nums[i], nums[j] = nums[j], nums[i]
            # 然后左右两边分别快排
            nums[i], nums[l] = nums[l], nums[i]
            fast_sort(l,i-1)
            fast_sort(i+1,r)

        nums = [str(i) for i in nums]
        fast_sort(0, len(nums)-1)
        return "".join(nums)

面试题 17.14. 最小K个数

class Solution:
    def smallestK(self, arr: List[int], k: int) -> List[int]:
        # python 的各种函数 是很方便 但是好像真的很令人恼火
        arr.sort()
        return arr[:k]
        # 冒泡排序法,时间复杂度高,超时
        for i in range(len(arr)):
            for j in range(i+1,len(arr)):
                if arr[i]>arr[j]:
                    arr[i], arr[j] = arr[j], arr[i]
        return arr[:k]

1630 等差子数组

class Solution:
   def checkArithmeticSubarrays(self, nums: List[int], l: List[int], r: List[int]) -> List[bool]:
       # 自己写的,开心
       res = []
       for i in range(len(l)):
           tmp = nums[l[i]:r[i]+1]
           tmp.sort()
           flag = True
           if len(tmp)==0 or len(tmp)==1: break # 有没有都行
           # 很蠢的是遍历所有的前后差值是否为同一个值,用flag标注
           cha = tmp[1]-tmp[0]
           for j in range(2,len(tmp)):
               if tmp[j]-tmp[j-1]!=cha:
                   flag = False
                   break
           res.append(flag)
       return res

973 最接近原点的 K 个点

对list每个元素按照x2+y2大小排序

class Solution:
    def kClosest(self, points: List[List[int]], K: int) -> List[List[int]]:
        res = []
        # 排序的第一种写法
        points = sorted(points, key=lambda x:x[0]**2+x[1]**2)
        # 排序的第二种写法
        points.sort(key=lambda x:x[0]**2+x[1]**2)
        return points[:K]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值