• LinkCode 下一个排列、上一个排列


    http://www.lintcode.com/zh-cn/problem/next-permutation-ii/#

    原题

    给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列。

    如果没有下一个排列,则输出字典序最小的序列。

    样例

    左边是原始排列,右边是对应的下一个排列。

    1,2,3 → 1,3,2

    3,2,1 → 1,2,3

    1,1,5 → 1,5,1

    解题思路(示例:[1,3,5,4,2])

    1. 从后开始往前遍历,找到后一个元素大于前一个元素的时候记录前一个元素的指针(也就是3元素的索引指针)
    2. 接着从3元素后面的列表中[5,4,2]中找到一个比3大的最小元素,将3与其交换后得到([1,4,……])
    3. 将其后面的列表按照从小到大排序即得到下一个排列([1,4,2,3,5])

    代码实现

    class Solution:
        # @param nums: a list of integer
        # @return: return nothing (void), do not return anything, modify nums in-place instead
        def nextPermutation(self, nums):
            # write your code here
            change_index = -1
            # 找到需要变换的比后一个数字小的数
            for i in xrange(len(nums)-1, 0, -1):
                if nums[i] > nums[i-1]:
                    change_index = i-1
                    break
            if change_index == -1:
                nums.reverse()
                return nums
            min_nums_index = change_index+1
            # 找到后面列表中比change_index元素大的最小值
            for j in xrange(change_index+1, len(nums)):
                if(nums[j]>nums[change_index]) and (nums[min_nums_index]>nums[j]):
                    min_nums_index = j
            # 交换元素
            nums[change_index], nums[min_nums_index] = nums[min_nums_index], nums[change_index]
            # 排序后面的列表
            back = sorted(nums[change_index+1:])
            nums[change_index+1:] = back
            return nums
    

    上一个排列

    是上一题的逆思路,这里就直接上代码啦

    class Solution:
        # @param num :  a list of integer
        # @return : a list of integer
        def previousPermuation(self, nums):
            # write your code here
            change_index = -1
            # 找到需要变换的比后一个数字大的数
            for i in xrange(len(nums)-1, 0, -1):
                if nums[i] < nums[i-1]:
                    change_index = i-1
                    break
            if change_index == -1:
                nums.reverse()
                return nums
            min_nums_index = change_index+1
            # 找到后面列表中比change_index元素小的最大值
            for j in xrange(change_index+1, len(nums)):
                if(nums[j]<nums[change_index]) and (nums[min_nums_index]<nums[j]):
                    min_nums_index = j
            # 交换元素
            nums[change_index], nums[min_nums_index] = nums[min_nums_index], nums[change_index]
            # 排序后面的列表,降序
            back = sorted(nums[change_index+1:],reverse=True)
            nums[change_index+1:] = back
            return nums
    

      

  • 相关阅读:
    SQL----Scalar 函数
    SQL----Group By and Having
    SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum
    SQL 函数
    Auto-increment 自动增长
    sql--ALTER
    sql--Drop语句
    sql--index 索引
    sql--select into,create database,create table,Constraints
    sql--union
  • 原文地址:https://www.cnblogs.com/LiCheng-/p/6650584.html
Copyright © 2020-2023  润新知