左神算法、牛客网算法-初级1(python实现)

归并排序

def merge_sort(nums):
    n = len(nums)
    if n <= 1:
        return nums
    mid = n >> 1
    left = merge_sort(nums[:mid])
    right = merge_sort(nums[mid:])
    left_point = 0
    right_point = 0
    res = []
    while left_point < len(left) and right_point < len(right):
        if left[left_point] <= right[right_point]:
            res.append(left[left_point])
            left_point += 1
        else:
            res.append(right[right_point])
            right_point += 1
    res += left[left_point:]
    res += right[right_point:]
    return res
               
nums = [3, 7, 4, 2, 6, 1]
print(merge_sort(nums))
[1, 2, 3, 4, 6, 7]

小和问题

nums = [1,3,4,2,5]
在一个数组中, 每一个数左边比当前数小的数累加起来, 叫做这个数组的小和。 求一个数组
的小和。
例子:
[1,3,4,2,5]
1左边比1小的数, 没有;
3左边比3小的数, 1;
4左边比4小的数, 1、 3;
2左边比2小的数, 1;
5左边比5小的数, 1、 3、 4、 2;
所以小和为1+1+3+1+1+3+4+2=16

result = 0
def samll_sum(nums):
    n = len(nums)
    if n <= 1:
        return nums
    mid = n >> 1
    left = samll_sum(nums[:mid])
    right = samll_sum(nums[mid:])
    left_point = 0
    right_point = 0
    res = []
    m = len(left)
    n = len(right)
    while left_point < m and right_point < n:
        if left[left_point] < right[right_point]:
            global result
            result += left[left_point] * (n - right_point)
            res.append(left[left_point])
            left_point += 1
        else:
            res.append(right[right_point])
            right_point += 1
    res += left[left_point:]
    res += right[right_point:]
    return res
nums = [1,3,4,2,5]
res = samll_sum(nums)
result

小白笔记,有不足之处留言指教,

你可能感兴趣的:(数据结构与算法,python,leetcode)