每日刷题(day03+day04)——leetcode 899. 有序队列+1403. 非递增顺序的最小子序列

115 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

题目名称

  1. 有序队列

题目内容

给定一个字符串 s 和一个整数 k 。你可以从 s 的前 k 个字母中选择一个,并把它加到字符串的末尾。

返回 在应用上述步骤的任意数量的移动后,字典上最小的字符串 。

样例

示例 1:

输入:s = "cba", k = 1 输出:"acb" 解释: 在第一步中,我们将第一个字符(“c”)移动到最后,获得字符串 “bac”。 在第二步中,我们将第一个字符(“b”)移动到最后,获得最终结果 “acb”。 示例 2:

输入:s = "baaca", k = 3 输出:"aaabc" 解释: 在第一步中,我们将第一个字符(“b”)移动到最后,获得字符串 “aacab”。 在第二步中,我们将第三个字符(“c”)移动到最后,获得最终结果 “aaabc”。

数据范围

提示:

  • 1 <= k <= S.length <= 1000
  • s 只由小写字母组成。

思路

当k>=2时,字符串就可以在有限次的移动后得到所有的重排,因此只需要对字符串进行sort排序最后输出 如果k=1,那么就找出s.length种排列情况,找到最小的string返回即可

代码

class Solution {
public:
    string orderlyQueue(string s, int k) {
        string minstr = s;
        if(k != 1){
            sort(s.begin(),s.end());
            return s;
            }
        for (int i=0;i<s.length();i++)
        {
            string temp;
            temp=s.substr(i,s.length()-i)+s.substr(0,i);
            minstr = min(minstr,temp);
        }
        return minstr;
    }
};

题目名称

  1. 非递增顺序的最小子序列

题目内容

给你一个数组 nums,请你从中抽取一个子序列,满足该子序列的元素之和 严格 大于未包含在该子序列中的各元素之和。

如果存在多个解决方案,只需返回 长度最小 的子序列。如果仍然有多个解决方案,则返回 元素之和最大 的子序列。

与子数组不同的地方在于,「数组的子序列」不强调元素在原数组中的连续性,也就是说,它可以通过从数组中分离一些(也可能不分离)元素得到。

注意,题目数据保证满足所有约束条件的解决方案是 唯一 的。同时,返回的答案应当按 非递增顺序 排列。

样例

示例 1:

输入:nums = [4,3,10,9,8] 输出:[10,9] 解释:子序列 [10,9] 和 [10,8] 是最小的、满足元素之和大于其他各元素之和的子序列。但是 [10,9] 的元素之和最大。  示例 2:

输入:nums = [4,4,7,6,7] 输出:[7,7,6] 解释:子序列 [7,7] 的和为 14 ,不严格大于剩下的其他元素之和(14 = 4 + 4 + 6)。因此,[7,6,7] 是满足题意的最小子序列。注意,元素按非递增顺序返回。
示例 3:

输入:nums = [6] 输出:[6]

数据范围

提示:

  • 1 <= nums.length <= 500
  • 1 <= nums[i] <= 100

思路

因为子序列不要求连续,所以可以直接对原容器从小到大排序,然后从后往前找符合的子序列
找到了之后reverse翻转输出即可

代码

class Solution {
public:
    int summ(vector<int> val, int first, int end){
        int sum = 0;
        for(int i=first; i<=end; i++){
            sum += val[i];
        }
        return sum;
    }

    vector<int> minSubsequence(vector<int>& nums) {
        int n = nums.size();
        sort(nums.begin(),nums.end());
        for(int i=n-1; i>=0; i--){
            if(summ(nums,i,n-1) > summ(nums,0,i-1)){
                nums.assign(nums.begin()+i, nums.end());
                reverse(nums.begin(), nums.end());
                break;
            }
        }
        return nums;
    }
};