- 解题思路:
1.常见的方法也是用数组,一轮改变一个元素,也就是每一轮将元素往后推一位,推k轮即可。
2 但这种方式做了很多无用功,简化一下就可以变成:将元素向右移动k个位置,那可以先将后k个元素拿出来放入一个新的数组中,然后将前(n - k )个元素向后移动k个距离,最后将新数组中的元素复制到原数组的前k个位置中。
3. 这也是我最推荐的方法。具体思路可以参考翻转数组。其实就是先将整个数组进行反转,然后将整个数组分成2个部分,前k个数字为一个部分,后(n - k)个数字为一个部分。再分别将两个部分内部进行反转,这样你发现是不是就完成了本题了。并且三个反转部分代码及其相似,所以可以使用函数来封装这一部分代码。
- 具体代码如下:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size(), kn = k % n;
reverse(nums, 0, n - 1);
reverse(nums, 0, kn - 1);
reverse(nums, kn, n - 1);
}
void reverse(vector<int>& nums, int start, int end) {
while(start < end) {
int num = nums[start];
nums[start] = nums[end];
nums[end] = num;
start++;
end--;
}
}
};
121、买卖股票的最佳时机
- 题解:
二维数组进行暴力求解当然也可以,但是会运行时间超时,所以我们来看一种比较简单的方式。我们当天选择卖出手中的股票,然后计算今天以前的股票最低点,最后将两者相减,得出正确答案,这样也就不用考虑卖出的实践早于买入的时间。代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
//假设今天卖出股票,然后计算今天之前的股票最低点
int min1 = 1e9;
int minprice = min1, maxprofit = 0;
for(int price : prices) {
maxprofit = max(maxprofit, price - minprice);
minprice = min(price, minprice);
}
return maxprofit;
}
};