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)的空间
目录
相关文章
|
2月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
51 0
Leetcode第21题(合并两个有序链表)
|
4月前
|
Python
【Leetcode刷题Python】21. 合并两个有序链表
介绍了几种不同的方法来合并多个已排序的链表,包括暴力求解、使用小顶堆以及分而治之策略。
44 2
|
2月前
【LeetCode 24】225.用队列实现栈
【LeetCode 24】225.用队列实现栈
12 0
|
2月前
|
算法
【LeetCode 23】232.用栈实现队列
【LeetCode 23】232.用栈实现队列
21 0
|
4月前
|
算法
LeetCode第21题合并两个有序链表
该文章介绍了 LeetCode 第 21 题合并两个有序链表的解法,通过创建新链表,依次比较两个链表的头节点值,将较小的值插入新链表,直至其中一个链表遍历完,再将另一个链表剩余部分接到新链表后面,实现合并。
LeetCode第21题合并两个有序链表
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 09. 用两个栈实现队列
使用两个栈实现队列的Python解决方案,包括初始化两个栈、实现在队列尾部添加整数的appendTail方法和在队列头部删除整数的deleteHead方法,以及相应的示例操作。
41 2
|
4月前
|
Python
【Leetcode刷题Python】641.循环双端队列
文章介绍了如何实现一个循环双端队列,包括其操作如插入、删除、获取队首和队尾元素,以及检查队列是否为空或已满,并提供了Python语言的实现代码。
25 0
|
4月前
|
Python
【Leetcode刷题Python】232. 用栈实现队列
如何使用Python语言通过两个栈来实现队列的所有基本操作,包括入队(push)、出队(pop)、查看队首元素(peek)和判断队列是否为空(empty),并提供了相应的代码实现。
22 0
|
5月前
|
Java
力扣经典150题第五十八题:合并两个有序链表
力扣经典150题第五十八题:合并两个有序链表
43 2
|
6月前
|
算法 Java
[Java·算法·中等] LeetCode21. 合并两个有序链表
[Java·算法·中等] LeetCode21. 合并两个有序链表
60 2