一、旋转数组(Rotate Array)
题目:给定数组 nums 和整数 k,将数组中的元素向右轮转 k 个位置。
代码:
cpp
class Solution {
public:
void rotate(vector<int>& nums, int k) {
vector<int> temp(nums);
int numsLen = nums.size();
int real = k % numsLen;
for (int i = 0; i < numsLen; ++i) {
if (i + real < numsLen) {
nums[i + real] = temp[i];
} else {
nums[i + real - numsLen] = temp[i];
}
}
}
};
思路很简单:
-
先用
temp备份一份原数组,避免边改边读。 -
对于原来下标
i的元素,旋转后应该到位置(i + real) % numsLen。 -
用
if / else手动实现了这个取模逻辑:-
i + real < numsLen放到i + real -
否则放到
i + real - numsLen
-
时间复杂度:O(n),遍历一次。
空间复杂度:O(n),额外一份备份数组。
如果想稍微简洁一点,可以写成:
cpp
int real = k % numsLen;
for (int i = 0; i < numsLen; ++i) {
int newIndex = (i + real) % numsLen;
nums[newIndex] = temp[i];
}
核心:备份原数组,用 (i + k) % n 计算新下标。
二、买卖股票的最佳时机 II
题目:给定数组 prices,prices[i] 是第 i 天的股价。可以多次买入和卖出(不能同时持有多股),求最大利润。
代码:
cpp
class Solution {
public:
int maxProfit(vector<int>& prices) {
int res = 0;
for (int i = 1; i < prices.size(); ++i) {
if (prices[i] > prices[i - 1]) {
res += prices[i] - prices[i - 1];
}
}
return res;
}
};
思路(贪心):
-
允许多次交易,只要不同时持有多股。
-
对于一段上涨区间
[p0 < p1 < ... < pk]:-
一次性买在
p0,卖在pk,利润是pk - p0; -
或者每天赚差价:
(p1 - p0) + (p2 - p1) + ... + (pk - p(k-1)),结果一样。
-
-
所以直接把所有"今天比昨天贵"的差价加起来,就是最大利润。
代码里就是:
-
从
i = 1开始遍历; -
如果
prices[i] > prices[i - 1],就把这两天的差价加进res。
时间复杂度:O(n);空间复杂度:O(1)。
这两个题的共同点:
都是线性扫描数组,加一点简单的小公式(旋转用 (i + k) % n,股票用"所有正的差价相加")。