LEETCODE排序-python

'''
python函数的使用:
有n个正整数,输出连成最大的整数串。
st = [str(x) for x in nums]
st.sort(key=cmp_to_key(lambda s1,s2:s1+s2 if s2+s1<s1+s2 else s2+s1))
'''

'''1-洗扑克牌-乱数排序
如何有效打乱一个数组:遍历数组的位置,然后产生随机数,将随机数位置与当前位置交换即可。
poker = [1,...,52]
'''
import random
def washPoker(poker):
    for i in range(52):
        j = random.randint(0,51)
        poker[i],poker[j] = poker[j],poker[i]
    return poker

'''2-三色旗排序法:将蓝白红三种旗子,按照顺序排好,要求移动次数最少,一次只能调换两个旗子。
解题思路:设置三个指标,blue=white=0,red=len-1,然后从左往右判断,白色w++,蓝色swap(b++,w++),
红色r向左移动,再swap(w,r)
'''
def algorithmGossip(flags):
    b,w,r = 0,0,len(flags)-1
    while w <= r:
        if flags[w] == 'w':
            w += 1
        elif flags[w] == 'b':
            flags[b],flags[w]=flags[w],flags[b]
            b += 1
            w += 1
        else:
            while w < r and flags[r] == 'r':
                r -= 1
            flags[w],flags[r] = flags[r],flags[w]
            r -= 1
    return flags

'''3-摆动排序:将数组排序成a <= b >= c <= d >= e......
解题思路1 nlogn:先排序,再调换二三,四五,。。。等的位置
python函数:
half = (len(nums)+1)//2
nums.sort()
nums[::2],nums[1::2] = nums[:half][::-1],nums[half:][::-1]
解题思路2 n:分析可知,当i为奇数时,nums[i] >= nums[i - 1]
当i为偶数时,nums[i] <= nums[i - 1]
'''
def One(nums):
    nums.sort()
    if len(nums) <= 2:
        return 
    for i in range(2, len(nums), 2):
        nums[i],nums[i-1] = nums[i-1],nums[i]

def Two(nums):#不能有相同的值,否则会出错
    if len(nums) <= 1:
        return
    for i in range(1, len(nums)):
        if (i%2==1 and nums[i] < nums[i-1]) || (i%2==0 and nums[i] > nums[i-1]):
            nums[i],nums[i-1] = nums[i-1],numss[i]

'''4-煎饼排序:我们选择一些正整数 k <= A.length,然后反转 A 的前 k 个元素的顺序。
解题思路:将A中的元素从大到小依次找出【1,...,len(A)】,逐个反转到数组的尾部。
'''
def nreverse(A, p):
    A[:p] = reversed(A[:p])
def pancakeSort(A):
    tail,res = len(A),[]
    while tail > 1:
        p = A.index(tail)
        if p != 0:
            num  = p + 1
            self.nreverse(A, num)
            res.append(num)
        self.nreverse(A, tail)
        res.append(tail)
        tail -= 1
    return res

'''5-距离相等的条形码:数组中相同的数字不能相连。[1,1,1,2,2,2]
解题思路:按照数量多少先进行排序,然后按奇偶填充。
'''
def rearrangeBarcodes(barcodes):
    counter = dict(collections.Counter(barcodes))
    #按出现次数统计元素
    sortedCounter = sorted( counter, key=lambda k: 0 - counter[k])
    barcodes = []
    #重新排序
    for i in sortedCounter:
        barcodes += [i] * counter[i]
    
    arrangedBarcodes = [None for _ in range(len(barcodes))]
    #间隔插入
    arrangedBarcodes[::2] = barcodes[:len(arrangedBarcodes[::2])]
    arrangedBarcodes[1::2] = barcodes[len(arrangedBarcodes[::2]):]

    return arrangedBarcodes

'''6-距离顺序排列矩阵单元格:给定矩阵中的一个坐标,按曼哈顿距离排列矩阵中其余的坐标。
曼哈顿距离:|r1 - r2| + |c1 - c2|
解题思路:利用空间换时间的想法,构造距离空间。
'''
def allCellsDistOrder(R, C, r0, c0):
    ans = []
    dic = {}
    for i in range(R):
        for j in range(C):
            diff = abs(i-r0)+abs(j-c0)
            print(diff)
            if diff not in dic:
                dic[diff] = [[i,j]]
            else:
                dic[diff].append([i,j])
    
    for i in range(R+C):
        if i in dic.keys():
            ans.extend(dic[i])
    return ans



'''
LeetCode堆排序经典应用:
1三角形的最大周长:给定一个长度数组,返回三条构成三角形的最大周长。
解题思路:不一定要将数组全部排序,构造大顶堆,边排序边判断两边之和大于第三边即可。

LeetCode归并排序经典应用:
1排序链表:
解题思路:递归归并
经典考察三个知识点:归并排序,找中间节点,合并链表

LeetCode桶排序经典应用:
1最大间距
应用:给500万考生成绩排序,超级快。适用于元素集合不大的情况,分数最多是0-1000。
应用:在一个文件中有10G个整数,乱序排列,要求找出中位数。内存限制为2G。只写出思路即可

解法有趣的题目
1通过删除字母匹配到字典里最长单词
2合并区间
3存在重复元素 III
5道困难题,解法很有意思,其中[区间和的个数]与[反转对]相似。
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值