leetcode-每日一题899. 有序队列(思维题)

简介: 当k = 1时,我们每次取 i 个首字符并将其移动到字符串末尾,对比找最小的字典序字符串即可

fc2644700400415281108602bd80cf7d.png


题目链接:https://leetcode.cn/problems/orderly-queue/


思路


方式一、思维


计算字典序最小的字符串,我们需要讨论k = 1 和 k > 1时两种情况


当k = 1时,我们每次取 i 个首字符并将其移动到字符串末尾,对比找最小的字典序字符串即可


当k > 1时,一定可以经过移动将字符串s变成字符串按照升序排序


代码示例


func orderlyQueue(s string, k int) string {
    if k == 1{
        ans := s
        for i := 1; i < len(s); i++{
            s = s[1:] + s[:1]
            if s < ans{
                ans = s
            }
        }
        return ans
    }
    ans := []byte(s)
    sort.Slice(ans, func(i, j int) bool {return ans[i] < ans[j]})
    return string(ans)
}


复杂度分析


  • 时间复杂度:O(n2),其中n时字符串长度

。当k = 1时,需要遍历n个字符串排列,每个字符串需要O(n)来判断是否为字典序最小,需要O(n2)的时间

。当k > 1时,对字符串进行排序,需要O(n logn)的时间


  • 空间复杂度:O(n),其中n时字符串长度,需要额外申请O(n)的空间
目录
相关文章
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
353 0
Leetcode第21题(合并两个有序链表)
|
Python
【Leetcode刷题Python】21. 合并两个有序链表
介绍了几种不同的方法来合并多个已排序的链表,包括暴力求解、使用小顶堆以及分而治之策略。
310 2
LeetCode第21题合并两个有序链表
该文章介绍了 LeetCode 第 21 题合并两个有序链表的解法,通过创建新链表,依次比较两个链表的头节点值,将较小的值插入新链表,直至其中一个链表遍历完,再将另一个链表剩余部分接到新链表后面,实现合并。
LeetCode第21题合并两个有序链表
|
Python
【Leetcode刷题Python】剑指 Offer 09. 用两个栈实现队列
使用两个栈实现队列的Python解决方案,包括初始化两个栈、实现在队列尾部添加整数的appendTail方法和在队列头部删除整数的deleteHead方法,以及相应的示例操作。
220 2
【LeetCode 24】225.用队列实现栈
【LeetCode 24】225.用队列实现栈
199 0
|
算法
【LeetCode 23】232.用栈实现队列
【LeetCode 23】232.用栈实现队列
180 0
|
Java
力扣经典150题第五十八题:合并两个有序链表
力扣经典150题第五十八题:合并两个有序链表
267 2
|
算法 Java
[Java·算法·中等] LeetCode21. 合并两个有序链表
[Java·算法·中等] LeetCode21. 合并两个有序链表
411 2
|
存储 算法 Python
二刷力扣--栈和队列
二刷力扣--栈和队列
239 1
|
算法 安全 Java
【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
660 1