携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
题目名称
- 有序队列
题目内容
给定一个字符串 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 <= 1000s只由小写字母组成。
思路
当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;
}
};
题目名称
- 非递增顺序的最小子序列
题目内容
给你一个数组 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 <= 5001 <= 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;
}
};