前言
今天主要复习了一下排序算法,冒牌排序与选择排序,以及快排,本来尝试用快排写了一下第一题,结果超出时间限制了,下次安排上。
第三天:排序
一、练习题目
题目链接 | 难度 |
---|---|
977. 有序数组的平方 | ★☆☆☆☆ |
268. 丢失的数字 | ★☆☆☆☆ |
1877. 数组中最大数对和的最小值 | ★☆☆☆☆ |
950. 按递增顺序显示卡牌 | ★☆☆☆☆ |
二、思路与代码
1. 有序数组的平方
给你一个按 非递减顺序排序的整数数组 nums,返回每个数字的平方 组成的新数组,要求也按非递减顺序排序。
双指针
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
length = len(nums)
newNums = []
for num in nums:
newNums.append(num*num)
ans = [0]*length
l, pos, r = 0, length-1, length-1
while l <= r:
if nums[l]*nums[l] > nums[r]*nums[r]:
ans [pos] = nums[l] * nums[l]
l += 1
else:
ans[pos] = nums[r]*nums[r]
r -= 1
pos -= 1
2.丢失的数字
给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。
class Solution(object):
def missingNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# ans = list(set(range(len(nums)+1)) - set(nums))
sum = 0
for i in range(len(nums)):
sum += nums[i] - i
sum -= i + 1
return abs(sum)
3.数组中最大数对和的最小值
利用贪心思想,先对数组排序,接着第一个和最后一个相加、第二个和倒数第二个相加,以此类推,就能保证最小的最大数对和。
class Solution(object):
def minPairSum(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
nums.sort()
s = []
l, r = 0, len(nums)-1
while l <= r:
s.append(nums[l]+nums[r])
l += 1
r -= 1
return max(s)
4. 按递增顺序显示卡牌
题目太长,没时间写了,改天再补上,下面是英雄大佬的思路,先码下来。