26.从排序数组中删除重复项
描述
- 给定一个有序数组,你需要原地删除其中的重复内容,使每个元素只出现一次,并返回新的长度。
- 不要另外定义一个数组,您必须通过用 O(1) 额外内存原地修改输入的数组来做到这一点。
示例
- 给定数组: nums = [1,1,2],
- 你的函数应该返回新长度 2, 并且原数组nums的前两个元素必须是1和2
- 不需要理会新的数组长度后面的元素
思路
- 简单思路:
1、由于数组是有序的,所有直接遍历数值,当发现一样的时候就把该元素移到数组的最后面,这样做空间复杂度能做到O(1),但时间复杂度不能保证是O(N),因为移动的过程是要不断遍历数组的。
2、这种做法不利于编程,判断循环结束的条件很难搞,一不小心就可能写错。
- 优化解:
1、其实只用遍历一次数组就好了,只有当数组不同的时候才进行交换。
2、维持两个指针,一个指向当前不重复的数字,一个指向下一个数字,当下一个数字与当前相同时,则不处理,继续向下,当不同时,就把它移到当前数组的下一个,并将当前元素前移;
3、如此,整个只要遍历一遍就能够搞定,空间O(1),时间O(n)
class Solution_26_01 {
public:
int removeDuplicates(vector &nums) {
int cur = 0, cnt = 0;
vector::iterator end = nums.end();
for (vector::iterator iter = nums.begin(); iter != end; iter++) {
cnt++;
cur = *iter;
vector::iterator next = iter + 1;
while (next != end && *next == cur) {
// 后移
for (vector::iterator tar = next; tar != (end - 1); tar++) {
int tmp = *tar;
*tar = *(tar + 1);
*(tar + 1) = tmp;
}
end--;
}
}
return cnt;
}
};
class Solution_26_02 {
public:
int removeDuplicates(vector &nums) {
if (nums.empty()) {
return 0;
}
int cnt = 1;
vector::iterator cur = nums.begin();
vector::iterator next = cur + 1;
for(; next != nums.end(); next++){
if(*next != *cur){
*(++cur) = *next;
cnt++;
}
}
return cnt;
}
};
// 更优的写法
class Solution_26_03 {
public:
int removeDuplicates(vector &nums) {
int index = !nums.empty();
for (int n : nums){
if(n > nums[index-1])
nums[index++] = n;
}
return index;
}
};
122.买卖股票的最佳时机 II
描述
- 假设有一个数组,它的第 i 个元素是一个给定的股票在第 i 天的价格。
- 设计一个算法来找到最大的利润。你可以完成尽可能多的交易(多次买卖股票)。然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。
Tips:
- 没有思路时,现在纸上写一个具体的例子来分析。另外想到思路不要马上就下手,理清了再说。
- 比如说这题,明明直接求每个区间内的正差值就可以了,自己却越搞越复杂。
class Solution_122_01 {
public:
int maxProfit(vector& prices) {
int totalProfit = 0, curProfit = 0;
if (prices.empty() or prices.size() == 1) {
return totalProfit;
}
int buy = 0, sold = buy + 1;
for (; sold != prices.size(); sold++) {
int tmpProfit = prices[sold] - prices[buy];
if (curProfit < tmpProfit) {
curProfit = tmpProfit;
} else {
totalProfit += curProfit;
curProfit = 0;
buy = sold;
}
}
if (buy != sold) { // 最后一次没卖
totalProfit += prices[sold - 1] - prices[buy];
}
return totalProfit;
}
};
class Solution_122_02 {
public:
int maxProfit(vector& prices) {
int total = 0;
if (!prices.empty()) {
for (int i = 0; i < prices.size() - 1; i++) {
if (prices[i + 1] > prices[i]) total += prices[i + 1] - prices[i];
}
}
return total;
}
};