.net 遍历数组找重复值写入一个新数组_数组与矩阵

eaacab2ac36ca09fb80db39e96d31250.png

在机器学习中,处理最多的数组与矩阵,有些面试官可能比较熟悉这个,所以考这个自然是有意义的。

下面来看题目。

  1. 把数组中的0易到末尾:这个问题很简单,可以做到线性时间,恒定空间。使用两个索引,一个索引遍历数组,一个索引只有遇到非零元素才递增。
  2. 改变矩阵维度:也需要维护两个索引。
  3. 找出数组中最长的连续1: 遍历数组,如果为1,counter+1,如果为0,counter为0
  4. 有序矩阵查找:从左下角开始查找。
  5. 有序矩阵的Kth smallest element:TopK问题,一方面可以使用二分法,使用看矩阵最大值与最小值的均值排位与K进行比较,如果大于K,则选左区间,反之右区间。另外一方面可以使用最大堆方法,先构造大小为K的最大堆,然后把矩阵中剩余的元素往堆里放,如果大于堆顶元素,则放弃,如果小于堆顶元素则pop原堆顶元素,把新元素push进去。(第K个最小用最大堆,第K个最大用最小堆。
  6. 一个数组元素在[1,n]之间,其中一个数被替换为另一个数,找出重复的数和丢失的数。最简单的方法是排序。比这更简单的是使用异或操作进行计算。代码如下: vector<int> findErrorNums(int[] nums){
    int len = nums.size();
    int diff = 0;
    vector<int> ret(2, 0);
    for (int i = 0; i < len; i++){
    diff ^= (nums[i] ^ (i+1));
    }
    diff ^= -diff;
    for (int i = 0; i < len; i++){
    if (nums[i] & diff) ret[0] ^= (nums[i]^(i+1));
    else ret[1] ^= (nums[i]^(i+1));
    }
    return ret;
    }
  7. 找出数组中重复的数,数组值在[1, n]之间:这个问题用异或解决比较快。也可以使用二分法来判断重复的数在哪里。
  8. 数组相邻差值个数:这是一个逻辑题目,其实倒排就可以。
  9. 数组的度:首先使用哈希表作为counter统计最大的度是哪一个数,然后使用双指针算出长度。线性空间,线性时间。题目:https://leetcode-cn.com/problems/degree-of-an-array/
  10. 对角元素相等的矩阵:很简单了,n方遍历,或者使用递归也行,加了一点空间。
  11. 嵌套数组: 遍历每一个元素,对于已经遍历过的元素标记为-1.
  12. 分割数组:当且仅当前i个数的最大值为i的时候,可以隔离出去。https://leetcode.com/problems/max-chunks-to-make-sorted/
  13. 给定数组拼接出最大的数[leetcode 179]:自定义排序。
  14. 顺时针螺旋打印矩阵[leetcode 54]:需要定义一个方向向量来帮助每次切换方向。这个题目总体感觉没有考数学技巧,而是方向的建模能力。解法:https://leetcode-cn.com/problems/spiral-matrix/solution/luo-xuan-ju-zhen-by-leetcode-solution/
  15. 由0和1组成的二维矩阵,找出1的最大连通域,计算其面积[leetcode 695]:使用深度优先算法加上计算。具体而言,对于每一个像素点,递归计算其面积。如果这个点为0,那么面积为0,否则递归计算其左右上下的面积。为了减少计算量,对于已经遍历过的点不再进行计算,因为只要是连通的,计算出的结果应该是一样的。
  16. 给定一个数组,返回每个对应位置右边第一个比他大的数,没有就是-1:这个是单调栈的思想,栈内第一个元素是0,对应arr[0]的索引,arr[1]如果大于arr[0],那么ret[0]就写为arr[1],并且pop掉索引0,同时push进1,后面依次处理。
  17. 一个由01组成的矩阵,问其中由1组成的矩形的个数(01 nm矩阵找最大1的子矩阵):可以使用动态规划解决。https://leetcode-cn.com/problems/maximal-square/solution/zui-da-zheng-fang-xing-by-leetcode-solution/
  18. 一个只包含0和1的数组,求包含k个1的最长区间:使用双指针可以解决
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值