返回介绍

solution / 1200-1299 / 1296.Divide Array in Sets of K Consecutive Numbers / README_EN

发布于 2024-06-17 01:03:21 字数 6330 浏览 0 评论 0 收藏 0

1296. Divide Array in Sets of K Consecutive Numbers

中文文档

Description

Given an array of integers nums and a positive integer k, check whether it is possible to divide this array into sets of k consecutive numbers.

Return true _if it is possible_. Otherwise, return false.

 

Example 1:

Input: nums = [1,2,3,3,4,4,5,6], k = 4
Output: true
Explanation: Array can be divided into [1,2,3,4] and [3,4,5,6].

Example 2:

Input: nums = [3,2,1,2,3,4,3,4,5,9,10,11], k = 3
Output: true
Explanation: Array can be divided into [1,2,3] , [2,3,4] , [3,4,5] and [9,10,11].

Example 3:

Input: nums = [1,2,3,4], k = 3
Output: false
Explanation: Each array should be divided in subarrays of size 3.

 

Constraints:

  • 1 <= k <= nums.length <= 105
  • 1 <= nums[i] <= 109

 

Note: This question is the same as 846: https://leetcode.com/problems/hand-of-straights/

Solutions

Solution 1

class Solution:
  def isPossibleDivide(self, nums: List[int], k: int) -> bool:
    cnt = Counter(nums)
    for v in sorted(nums):
      if cnt[v]:
        for x in range(v, v + k):
          if cnt[x] == 0:
            return False
          cnt[x] -= 1
          if cnt[x] == 0:
            cnt.pop(x)
    return True
class Solution {
  public boolean isPossibleDivide(int[] nums, int k) {
    Map<Integer, Integer> cnt = new HashMap<>();
    for (int v : nums) {
      cnt.put(v, cnt.getOrDefault(v, 0) + 1);
    }
    Arrays.sort(nums);
    for (int v : nums) {
      if (cnt.containsKey(v)) {
        for (int x = v; x < v + k; ++x) {
          if (!cnt.containsKey(x)) {
            return false;
          }
          cnt.put(x, cnt.get(x) - 1);
          if (cnt.get(x) == 0) {
            cnt.remove(x);
          }
        }
      }
    }
    return true;
  }
}
class Solution {
public:
  bool isPossibleDivide(vector<int>& nums, int k) {
    unordered_map<int, int> cnt;
    for (int& v : nums) ++cnt[v];
    sort(nums.begin(), nums.end());
    for (int& v : nums) {
      if (cnt.count(v)) {
        for (int x = v; x < v + k; ++x) {
          if (!cnt.count(x)) {
            return false;
          }
          if (--cnt[x] == 0) {
            cnt.erase(x);
          }
        }
      }
    }
    return true;
  }
};
func isPossibleDivide(nums []int, k int) bool {
  cnt := map[int]int{}
  for _, v := range nums {
    cnt[v]++
  }
  sort.Ints(nums)
  for _, v := range nums {
    if _, ok := cnt[v]; ok {
      for x := v; x < v+k; x++ {
        if _, ok := cnt[x]; !ok {
          return false
        }
        cnt[x]--
        if cnt[x] == 0 {
          delete(cnt, x)
        }
      }
    }
  }
  return true
}

Solution 2

from sortedcontainers import SortedDict


class Solution:
  def isPossibleDivide(self, nums: List[int], k: int) -> bool:
    if len(nums) % k != 0:
      return False
    sd = SortedDict()
    for h in nums:
      if h in sd:
        sd[h] += 1
      else:
        sd[h] = 1
    while sd:
      v = sd.peekitem(0)[0]
      for i in range(v, v + k):
        if i not in sd:
          return False
        if sd[i] == 1:
          sd.pop(i)
        else:
          sd[i] -= 1
    return True
class Solution {
  public boolean isPossibleDivide(int[] nums, int k) {
    if (nums.length % k != 0) {
      return false;
    }
    TreeMap<Integer, Integer> tm = new TreeMap<>();
    for (int h : nums) {
      tm.put(h, tm.getOrDefault(h, 0) + 1);
    }
    while (!tm.isEmpty()) {
      int v = tm.firstKey();
      for (int i = v; i < v + k; ++i) {
        if (!tm.containsKey(i)) {
          return false;
        }
        if (tm.get(i) == 1) {
          tm.remove(i);
        } else {
          tm.put(i, tm.get(i) - 1);
        }
      }
    }
    return true;
  }
}
class Solution {
public:
  bool isPossibleDivide(vector<int>& nums, int k) {
    if (nums.size() % k != 0) return false;
    map<int, int> mp;
    for (int& h : nums) mp[h] += 1;
    while (!mp.empty()) {
      int v = mp.begin()->first;
      for (int i = v; i < v + k; ++i) {
        if (!mp.count(i)) return false;
        if (mp[i] == 1)
          mp.erase(i);
        else
          mp[i] -= 1;
      }
    }
    return true;
  }
};
func isPossibleDivide(nums []int, k int) bool {
  if len(nums)%k != 0 {
    return false
  }
  m := treemap.NewWithIntComparator()
  for _, h := range nums {
    if v, ok := m.Get(h); ok {
      m.Put(h, v.(int)+1)
    } else {
      m.Put(h, 1)
    }
  }
  for !m.Empty() {
    v, _ := m.Min()
    for i := v.(int); i < v.(int)+k; i++ {
      if _, ok := m.Get(i); !ok {
        return false
      }
      if v, _ := m.Get(i); v.(int) == 1 {
        m.Remove(i)
      } else {
        m.Put(i, v.(int)-1)
      }
    }
  }
  return true
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文