2610. 转换二维数组

Posted lxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2610. 转换二维数组相关的知识,希望对你有一定的参考价值。

题目链接:2610. 转换二维数组

方法:哈希表

解题思路

统计\\(nums\\)中每个元素的数量,然后每行输出其中的\\(1\\)个,直到元素全部输出。

代码

class Solution 
public:
    vector<vector<int>> findMatrix(vector<int>& nums) 
        int n = nums.size();
        vector<int> cnt(n + 1); // 统计数量
        for (auto &num : nums) cnt[num] ++ ;
        vector<vector<int>> ans;
        int flag = n;
        while (flag) 
            vector<int> level; // 输出当前行
            for (int i = 1; i <= n; i ++ ) 
                if (cnt[i] != 0)  // 输出1个
                    level.push_back(i);
                    cnt[i] -- ;
                    flag -- ;
                
            
            ans.push_back(level);
        
        return ans;
    
;

复杂度分析

时间复杂度:\\(O(Cn),C = nums中最多的元素数量\\)
空间复杂度:\\(O(n)\\)

将二维数组转换为一维数组,交替其值

【中文标题】将二维数组转换为一维数组,交替其值【英文标题】:Convert a bidimensional array to a 1D array alternating their values 【发布时间】:2018-11-02 23:50:17 【问题描述】:

我有一个这样的二维数组:

let test2d = [
  ["foo", "bar"],
  ["baz", "biz"]
]

如果我想将此二维数组转换为一维数组(不改变它们的值),我可以通过两种方式实现:

第一种方式:

let merged = test2d.reduce( (prev, next) => prev.concat(next) )
console.log(merged) // ["foo", "bar", "baz", "biz"]

第二种方式:

let arr1d = [].concat.apply([], test2d)
console.log(arr1d) // ["foo", "bar", "baz", "biz"]

问题:我怎样才能得到一个一维数组,但它们的值是交替的?我的意思是这样的:

["foo", "baz", "bar", "biz"]

【问题讨论】:

【参考方案1】:

您可以使用此处定义的zip 函数:Javascript equivalent of Python's zip function

let zip= rows => rows[0].map((_,c)=>rows.map(row=>row[c]))

所以你可以调用:

let arr1d = [].concat.apply([], zip(test2d))

这是完整的代码:

let test2d = [ ["foo", "bar"], ["baz", "biz"] ]

let zip = rows => rows[0].map((_, c) => rows.map(row => row[c]))

let arr1d = [].concat.apply([], zip(test2d))

console.log(arr1d)

【讨论】:

这个很优雅!谢谢你的回答。【参考方案2】:

您可以为每个索引获取一个数组,并在最后连接数组。

var array = [["foo", "bar"], ["baz", "biz"]],
    result = [].concat(...array.reduce((r, a) => 
        a.forEach((v, i) => (r[i] = r[i] || []).push(v));
        return r;
    , []));

console.log(result);

【讨论】:

嗨@NinaScholz,如果你不介意你能详细说明(r[i] = r[i] || []).push(v)吗?我一直遵循您的解决方案,直到那行代码丢失 你可以写两行代码:r[i] = r[i] || [];r[i].push(v)。第一行检查r[i] 是否为真,就像一个数组,如果不是,它将一个数组作为assingment。第二个将项目推送到此数组。【参考方案3】:

为什么不使用常规的 for 循环?这是高效且易于阅读的。

var arr1d = [];
for (let i = 0; i < test2d[0].length; i++) 
    for (let j = 0; j < test2d.length; j++) 
        arr1d.push(test2d[j][i]);
    

【讨论】:

这个解决方案也有效,即使有更多的行和列。谢谢!【参考方案4】:

这个解决方案很容易理解,它只是使用嵌套的 for 循环来获得所需的输出:

var data = [];  // This will be the new array
let test2d =    // This is your 2D array
[  
  ["foo", "bar"],
  ["baz", "biz"]
]

// Here we use nested for-loops to add the items to data[] in the desired order
for(var i = 0; i < test2d.length; i++) 
    for(var j = 0; j < test2d[0].length; j++) 
        data.push(test2d[j][i]);
    


console.log(data); // Print the output :)

data 数组现在等于:[ "foo", "baz", "bar", "biz" ]

希望这有帮助!

【讨论】:

感谢您的回答,但此解决方案仅适用于我的 test2d 数组,但如果我向数组中添加更多行和列,它就不起作用。为什么?因为诀窍是从列 (test2d[0].length) 而不是行 (test2d.length) 开始循环。查看 patstuart 的答案。

以上是关于2610. 转换二维数组的主要内容,如果未能解决你的问题,请参考以下文章

稀疏数组与二维数组的转换

opencv由二维数组转换图像问题

PHP二维数组转换成一维数组,一个变量多个二维数组转换成一维数组,PHP二维数组(或任意维数组)转换成一维数组的方法汇总,array_reduce(); array_walk_recursive()

JS二维数组转换一维数组

将二维向量转换为二维数组

转换二维数组