leetcode 376 三种方法+dp 摆动子

图片.png
  • 方法1:将两两差保存在另外一个vector中,dp:


    WeChat Image_20190106140515.jpg
  • 方法2:


    WeChat Image_20190106140521.jpg
  • 方法3:


    WeChat Image_20190106140525.jpg
  • code;

//int wiggleMaxLength(vector& nums) {
//  if (nums.size() <= 1)
//      return nums.size();
//  vector dp;
//  for (int i = 1; i < nums.size();i++) {
//      if (nums[i] - nums[i - 1] == 0)
//          continue;
//      dp.push_back(nums[i] - nums[i - 1]);
//  }
//  if (dp.size() == 0)
//      return 1;
//  bool flag = (dp[0] > 0) ? true : false;
//  vector ans(dp.size(),1);
//  for (int i = 1; i < dp.size(); i++) {
//      if ((dp[i]>0&& flag==true) ||(dp[i]<0&& flag==false))//if true-->符号相同
//          ans[i] = ans[i - 1];
//      else
//          ans[i] = ans[i-1] + 1;
//      flag= (dp[i] > 0) ? true : false;
//  }
//
//  return ans.back() + 1;
//}
////其中p[i]表示到i位置时首差值为正的摆动子序列的最大长度,
////q[i]表示到i位置时首差值为负的摆动子序列的最大长度
//int wiggleMaxLength(vector& nums) {
//  if (nums.empty()) return 0;
//  vector p(nums.size(), 1);
//  vector q(nums.size(), 1);
//  for (int i = 1; i < nums.size(); ++i) {
//      for (int j = 0; j < i; ++j) {
//          if (nums[i] > nums[j]) 
//              p[i] = max(p[i], q[j] + 1);
//          else if (nums[i] < nums[j]) 
//              q[i] = max(q[i], p[j] + 1);
//      }
//  }
//  return max(p.back(), q.back());
//}
//如果当前数字比前一个数字大,则p=q+1,
//如果比前一个数字小,则q=p+1,最后取p和q中的较大值跟n比较,取较小的那个
int wiggleMaxLength(vector& nums) {
    int p = 1, q = 1, n = nums.size();
    for (int i = 1; i < n; ++i) {
        if (nums[i] > nums[i - 1]) 
            p = q + 1;
        else if (nums[i] < nums[i - 1]) 
            q = p + 1;
    }
    return min(n, max(p, q));
}

你可能感兴趣的:(leetcode 376 三种方法+dp 摆动子)