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