LeetCodeDay01

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;
  }
};

你可能感兴趣的:(LeetCodeDay01)