给你一个正整数数组 arr(可能存在重复的元素),请你返回可在 一次交换(交换两数字 arr[i] 和 arr[j]
的位置)后得到的、按字典序排列小于 arr 的最大排列。如果无法这么操作,就请返回原数组
示例 1:
输入:arr = [3,2,1]
输出:[3,1,2]
解释:交换 2 和 1
示例 2:
输入:arr = [1,1,5]
输出:[1,1,5]
解释:已经是最小排列
示例 3:
输入:arr = [1,9,4,6,7]
输出:[1,7,4,6,9]
解释:交换 9 和 7
一开始把问题想复杂了,还专门用一个index记录最小点文章来源:https://www.toymoban.com/news/detail-613311.html
class Solution(object):
def prevPermOpt1(self, arr):
"""
:type arr: List[int]
:rtype: List[int]
"""
length = len(arr)
if length <=1: return arr
min_index,min_value = length-1,arr[-1]
for l in range(length-2,-1,-1):
if arr[l] <= min_value:
min_index,min_value = l,arr[l]
else:
j = min_index
for i in range(l,length):
if arr[j] < arr[i] < arr[l]:
j = i
arr[l],arr[j] = arr[j],arr[l]
break
return arr
后来想到还是从数组的尾巴往前找,如果 a r r [ l ] < = a r r [ l + 1 ] arr[l]<=arr[l+1] arr[l]<=arr[l+1],即满足单调递增,就继续往前找,直到不满足;不满足的时候,找后面一个小于 a r r [ l ] arr[l] arr[l]但是离 a r r [ l ] arr[l] arr[l]差距最小的点即可。文章来源地址https://www.toymoban.com/news/detail-613311.html
class Solution(object):
def prevPermOpt1(self, arr):
"""
:type arr: List[int]
:rtype: List[int]
"""
length = len(arr)
if length <=1: return arr
min_index,min_value = length-1,arr[-1]
for l in range(length-2,-1,-1):
if arr[l] <= arr[l+1]:
continue
else:
j = l+1
for i in range(l,length):
if arr[j] < arr[i] < arr[l]:
j = i
arr[l],arr[j] = arr[j],arr[l]
break
return arr
到了这里,关于leetcode 1053. 交换一次的先前排列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!