Skip to content

Latest commit

 

History

History
59 lines (56 loc) · 1.52 KB

isPossible.md

File metadata and controls

59 lines (56 loc) · 1.52 KB
/*
给你一个按升序排序的整数数组 num(可能包含重复数字),请
你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 。
如果可以完成上述分割,则返回 true ;否则,返回 false 。
*/
/*
示例 1:
输入: [1,2,3,3,4,5]
输出: True
解释:
你可以分割出这样两个连续子序列 :
1, 2, 3
3, 4, 5
示例 2:
输入: [1,2,3,3,4,4,5,5]
输出: True
解释:
你可以分割出这样两个连续子序列 :
1, 2, 3, 4, 5
3, 4, 5
示例 3:
输入: [1,2,3,4,4,5]
输出: False
提示:
输入的数组长度范围为 [1, 10000]
 */
/**
 * @param {number[]} nums
 * @return {boolean}
 */
var isPossible = function(nums) {
  if (nums.length < 3) return false;
  let start = [nums[0]]; //每个序列的开始点
  let end = [nums[0]]; //每个序列的结束点
  for (let i = 1; i < nums.length; i++) {
    const endIndex = end.lastIndexOf(nums[i] - 1); //从已有序列的后面从后开始查找(贪心策略:使最新加入的序列尽肯能长,因为新序列肯定比旧序列短)
    if (endIndex > -1) {
      //找到,可以接在已有序列的后面
      end[endIndex] = nums[i];
    } else {
      //找不到,重新开一个序列
      start[i] = nums[i];
      end[i] = nums[i];
    }
  }

  //是否所有序列长度都大于2
  for (let j = 0; j < start.length; j++) {
    if (end[j] - start[j] < 2) {
      return false;
    }
  }
  return true;
};

console.log(isPossible([1, 2, 3, 3, 4, 4, 5, 5, 7]));