LeetCode 2610. 转换二维数组【数组,哈希表】1373

2024-01-04 23:28

本文主要是介绍LeetCode 2610. 转换二维数组【数组,哈希表】1373,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

给你一个整数数组 nums 。请你创建一个满足以下条件的二维数组:

  • 二维数组应该  包含数组 nums 中的元素。
  • 二维数组中的每一行都包含 不同 的整数。
  • 二维数组的行数应尽可能  。

返回结果数组。如果存在多种答案,则返回其中任何一种。

请注意,二维数组的每一行上可以存在不同数量的元素。

示例 1:

输入:nums = [1,3,4,1,2,3,1]
输出:[[1,3,4,2],[1,3],[1]]
解释:根据题目要求可以创建包含以下几行元素的二维数组:
- 1,3,4,2
- 1,3
- 1
nums 中的所有元素都有用到,并且每一行都由不同的整数组成,所以这是一个符合题目要求的答案。
可以证明无法创建少于三行且符合题目要求的二维数组。

示例 2:

输入:nums = [1,2,3,4]
输出:[[4,3,2,1]]
解释:nums 中的所有元素都不同,所以我们可以将其全部保存在二维数组中的第一行。

提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= nums.length

解法 哈希表

用一个哈希表 cnt \textit{cnt} cnt 记录每个元素的剩余次数。构造答案时,遍历哈希表,如果元素 x x x 的剩余次数不为 0 0 0 ,则将 x x x 加入新行中,并令 c n t [ x ] cnt[x] cnt[x] 减一;如果 x x x 的次数为 0 0 0 ,则将 x x x c n t cnt cnt 中删除。这需要两个循环。

# python
class Solution:def findMatrix(self, nums: List[int]) -> List[List[int]]:ans = []cnt = Counter(nums)while cnt:ans.append(list(cnt)) # 每次将返回字典的key列表放入ans中for x in ans[-1]:cnt[x] -= 1if cnt[x] == 0:del cnt[x] # 从字典中删除键值对return ans# go
func findMatrix(nums []int) (ans [][]int) {cnt := map[int]int {}for _, x := range nums {cnt[x]++}for len(cnt) > 0 {row := []int {}for x := range cnt {row = append(row, x)if cnt[x]--; cnt[x] == 0 {delete(cnt, x)}}ans = append(ans, row)}return
}

实际上,我们可以在构造哈希表的循环中,就完成答案二维数组的构造。类似「二叉树的右视图」那一题,我们遍历数组,记录每个元素的出现次数,当发现元素 x x x i d x idx idx 次出现时,如果二维数组的行数 ≤ i d x \le idx idx ,则不需要新行,将 x x x 放入第 i d x idx idx 行;否则添加新一行,再将元素 x x x 放入

// cpp
class Solution {
public:vector<vector<int>> findMatrix(vector<int>& nums) {vector<vector<int>> ans;int cnt[201] = {0};for (int x : nums) {++cnt[x];if (ans.size() < cnt[x]) ans.emplace_back();ans[cnt[x] - 1].push_back(x);}   return ans;}
};// java
class Solution {public List<List<Integer>> findMatrix(int[] nums) {var ans = new ArrayList<List<Integer>>();int[] cnt = new int[220];for (int x : nums) {++cnt[x];if (ans.size() < cnt[x]) ans.add(new ArrayList<Integer>());ans.get(cnt[x] - 1).add(x);}return ans;}
}

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n) ,其中 n n n nums \textit{nums} nums 的长度。
  • 空间复杂度: O ( n ) O(n) O(n)

这篇关于LeetCode 2610. 转换二维数组【数组,哈希表】1373的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/570926

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &