2833.距离原点最远的点
给你一个长度为 n
的字符串 moves
,该字符串仅由字符 'L'
、'R'
和 '_'
组成。字符串表示你在一条原点为 0
的数轴上的若干次移动。
你的初始位置就在原点(0
),第 i
次移动过程中,你可以根据对应字符选择移动方向:
- 如果
moves[i] = 'L'
或moves[i] = '_'
,可以选择向左移动一个单位距离 - 如果
moves[i] = 'R'
或moves[i] = '_'
,可以选择向右移动一个单位距离
移动 n
次之后,请你找出可以到达的距离原点 最远 的点,并返回 从原点到这一点的距离 。
示例 1:
输入:moves = "L_RL__R"
输出:3
解释:可以到达的距离原点 0 最远的点是 -3 ,移动的序列为 "LLRLLLR" 。
示例 2:
输入:moves = "_R__LL_"
输出:5
解释:可以到达的距离原点 0 最远的点是 -5 ,移动的序列为 "LRLLLLL" 。
示例 3:
输入:moves = "_______"
输出:7
解释:可以到达的距离原点 0 最远的点是 7 ,移动的序列为 "RRRRRRR" 。
提示:
1 <= moves.length == n <= 50
moves
仅由字符'L'
、'R'
和'_'
组成
思路
- 当
L_count
>R_count
时,字符串中向左的移动比向右的多。而每个 _ 可以视为一个“自由移动”,它可以选择向左或向右移动。为了到达原点最远的距离,所有的 _都应该选择向左移动。所以,abs(L_count - R_count) + _count
就是最远的距离。
这个解法的核心思想是,为了达到最远的距离,应该尽可能地选择一个方向移动。
完整版
- 因为需要移动n次,所有的移动字符都需要被遍历。因此,我们需要将L的总数与R的总数相减,再加上自由步数。
class Solution {
public:
int furthestDistanceFromOrigin(string moves) {
int L_count = count(moves.begin(),moves.end(),'L');
int R_count = count(moves.begin(),moves.end(),'R');
int _count = count(moves.begin(),moves.end(),'_');
return abs(L_count-R_count)+_count;
}
};
2834.找出美丽数组的最小和
给你两个正整数:n
和 target
。
如果数组 nums
满足下述条件,则称其为 美丽数组 。
nums.length == n
.nums
由两两互不相同的正整数组成。- 在范围
[0, n-1]
内,不存在 两个 不同 下标i
和j
,使得nums[i] + nums[j] == target
。
返回符合条件的美丽数组所可能具备的 最小 和。
示例 1:
输入:n = 2, target = 3
输出:4
解释:nums = [1,3] 是美丽数组。
- nums 的长度为 n = 2 。
- nums 由两两互不相同的正整数组成。
- 不存在两个不同下标 i 和 j ,使得 nums[i] + nums[j] == 3 。
可以证明 4 是符合条件的美丽数组所可能具备的最小和。
示例 2:
输入:n = 3, target = 3
输出:8
解释:
nums = [1,3,4] 是美丽数组。
- nums 的长度为 n = 3 。
- nums 由两两互不相同的正整数组成。
- 不存在两个不同下标 i 和 j ,使得 nums[i] + nums[j] == 3 。
可以证明 8 是符合条件的美丽数组所可能具备的最小和。
示例 3:
输入:n = 1, target = 1
输出:1
解释:nums = [1] 是美丽数组。
提示:
1 <= n <= 105
1 <= target <= 105
思路
本题就和上次周赛的贪心很像了,求得也是可能的最小和,所以需要从最小的数字开始取!
完整版
和上次周赛代码基本相同,求的都是可能的最小和问题。
class Solution {
public:
long long minimumPossibleSum(int n, int target) {
set<long long>used;
int cur = 1;
long long sum=0;
for(int i=1;i<=n;i++){
while(used.count(cur)||used.count(target-cur)){
cur++;
}
used.insert(cur);
sum+=cur;
}
return sum;
}
};