文章目录
- python语法记录 sort
- 格式
- 1005.K次取反后最大化的数组和
- 思路
- 方法一
- 方法二 按照绝对值排序 教程
- 🎈✨ 背住 按照绝对值进行降序排序的语法是:
- 134. 加油站
- 思路
- 方法一 教程解法
- 方法二 暴力求解
- 135. 分发糖果
- 思路
- 方法一
- 总结
python语法记录 sort
link
格式
列表为A
A.sort(cmp, key, reverse)
和A = sorted(A, cmp, key, reverse)
是等价的
- 其中cmp表示排序时进行比较的函数【一般不用,是高级用法的范畴,自定义函数】
- key为函数,指定取待排序元素的哪一项进行排序。可以指定一个函数或者lambda函数
- 例如key = lambda x: x[ 2 ] 就表示用A的元素的第二个内容进行排序
- 例如key = lambda x : abs(s)就表示用A中的元素的abs进行排序
- 例如key = lambda x: x[ 2 ] 就表示用A的元素的第二个内容进行排序
- reverse表示是按照正序还是反序
补充:
- 多级排序:先照着第三个元素内容排序,再是第二个
1005.K次取反后最大化的数组和
思路
这题很简单的,但是我没有想出来,可能今天过于焦虑紧张了
总体思路:两步贪心,先给nums sort一下【🎈✨按照绝对值进行排序】
- 对于负数全部进行取反;
- 如果多到k,对于全是非负数的nums里面的最小值进行取反(如果k为奇数,因为偶数情况相当于没变)
方法一
下面是自己写的,但是两次sort,因为没有按照绝对值进行排序降序
class Solution(object):
def largestSumAfterKNegations(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
nums = sorted(nums)
for i in range(0,len(nums)-1):
if nums[i] < 0 and k > 0:
k -= 1
nums[i] = -nums[i]
elif nums[i] >= 0: break
nums = sorted(nums)#再排序一次
if k%2 == 1: nums[0] = -nums[0]
return sum(nums)
方法二 按照绝对值排序 教程
🎈✨ 背住 按照绝对值进行降序排序的语法是:
sorted(nums, key=lambda x: abs(x), reverse=True) 或者nums.sort( key=lambda x: abs(x), reverse=True)
class Solution(object):
def largestSumAfterKNegations(self, nums,K):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
A = sorted(nums, key=lambda x: abs(x), reverse=True) # 第一步:按照绝对值降序排序数组A
for i in range(len(A)): # 第二步:执行K次取反操作
if A[i] < 0 and K > 0:
A[i] *= -1
K -= 1
if K % 2 == 1: # 第三步:如果K还有剩余次数,将绝对值最小的元素取反
A[-1] *= -1
result = sum(A) # 第四步:计算数组A的元素和
return result
134. 加油站
思路
因为题目说了有唯一解,所以可以使用暴力求解的方法
贪心算法(方法二):方法一就不用看了
总体思路:每个加油站gas[i]-cost[i]都有剩余量,如果从起始位置累加剩余量小于0的话,说明那一天不行,断油了,从i+1开始作为起始位置,再来绕圈累加;
为什么是从i+1开始,有没有可能在预先定义的起始位置和i之间有一个合适的呢?教程方法二后段也给出了解释
方法一 教程解法
重新做,我没咋记住
class Solution(object):
def canCompleteCircuit(self, gas, cost):
"""
:type gas: List[int]
:type cost: List[int]
:rtype: int
"""
if sum(gas) < sum(cost): return -1
start = 0
res = 0
for i in range(0,len(cost)):
res += gas[i] - cost[i]
if res < 0 :
start = i+1
res = 0
return start
方法二 暴力求解
就是将每个为起始位置的都遍历一遍,看看中间是否会有断油的情况
trick💘
循环index的写法:index = (i + 1) % len(cost)
下面的写法超时了
class Solution(object):
def canCompleteCircuit(self, gas, cost):
"""
:type gas: List[int]
:type cost: List[int]
:rtype: int
"""
for i in range(len(cost)):
res = gas[i] - cost[i]# 起始点的剩余量
next_index = (i+1) % len(gas)
while res > 0 and next_index != i:#如果没有断油,并且没有回到起始点
res += gas[next_index] - cost[next_index]
next_index = (next_index+1) % len(gas)
if res >= 0 and next_index == i:
return i
return -1
135. 分发糖果
思路
这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右边,如果两边一起考虑一定会顾此失彼。
首先保证右边的孩子大于左边孩子的情况:从前往后遍历
左边的孩子大于右边的孩子的情况:从后往前遍历【为什么不能从后往前遍历看教程】
具体操作:注意第二个情况需要将第一个情况包含进去,取一个max
方法一
class Solution(object):
def candy(self, ratings):
"""
:type ratings: List[int]
:rtype: int
"""
candy = [1] * len(ratings)
for i in range(1,len(ratings)):
if ratings[i] > ratings[i-1]:
candy[i] = candy[i-1] + 1
for i in range(len(ratings)-2,-1,-1):
if ratings[i] > ratings[i+1]:
candy[i] = max(candy[i],candy[i+1]+1)
return sum(candy)