Array小结

来源:互联网 发布:lol域名为何火 编辑:程序博客网 时间:2024/05/16 07:29

在处理dfs问题的时候,注意要有一个bar,也就是start,否者会出现重复计算,正如同那些
Combination Sum问题,一般来讲,去重复,起始位置,结果累加,这些问题一定要注意好

微软面经里面的一道题目

链接:https://www.nowcoder.com/discuss/5556
(2)一个矩阵中元素分类的算法。一个矩阵中的元素和它周围八个元素是相邻的。如果两个元素相邻切相等就认为他们是一类。
输入m*n矩阵A,输出分类后的m*n矩阵B。
因为涉及到周边的八个相邻的地方。先左上角到右下角,每次对比左上的四个元素,然后从右下角到左上角,每次对比四个元素

打印菱形

思路:求出最大的max,然后根据奇偶性进行判定。当打印到下半部分的时候,根据奇偶性进行怕判定。

566. Reshape the Matrix

要求:数组改变形状, 错误:index没有++,注意不能改变返回原数组

561. Array Partition I

要求:数组为2*n大小的,分成n对,求令每对较小的值的和最大的值,数学转化下,Sm = (Sa - Sd)/ 2,Sd最小即可

560. Subarray Sum Equals K

要求:subarray的和等于某个数
思路:首先想到dp,发现思路错了,这个是subarray,后来换成map
错误:把k=0单独拿出来考虑增加了程序的复杂度,同时缓存到了累加和,增加了空间复杂度
错误:map.put(0, 1),个数问题

523. Continuous Subarray Sum

要求:subarray的和等于某个数的倍数, 数组的数是非负的, 要求子数组的长度最少为2,
错误:整个思路都是错的,涉及到下标问题,要对下标进行映射,充分利用求余,策略跟上题一样

532. K-diff Pairs in an Array

要求:输出数组里面两个不同下标的数差别为k的个数,
错误:要求是不同的pair,相同元素要去掉,注意到k为0的情况

530. Minimum Absolute Difference in BST

要求:返回二叉查找树结点之间绝对值最小的值
错误:没有充分利用二叉查找树的中序遍历性质,2B了,二叉树中序

495. Teemo Attacking

错误:数组为空的条件返回值错误, 持续中毒,间隔问题

485. Max Consecutive Ones

要求:输出数组中最大连续1的个数
思路:双指针,注意循环完整后的resu的更新 bugfree

414. Third Maximum Number

要求:输出数组中第三大的数
思路:注意数组中出现重复的地方

381. Insert Delete GetRandom O(1) - Duplicates allowed

得到随机数,根据出现次数的概率线性变化
思路:利用list与map,注意:删除的时候为了不影响下标,如何删除的不是最后一位,将当前的移动到最后一位,画龙点睛之笔

215. Kth Largest Element in an Array

要求:数组中第k大的数
思路:快排

//数组快排比较优美的代码,敲黑板背下来。次数,数组快排要搞定public class Solution {    public int findKthLargest(int[] a, int k) {        int n = a.length;        int p = quickSelect(a, 0, n - 1, k - 1);        return a[p];  }  // return the index of the kth smallest number  int quickSelect(int[] a, int lo, int hi, int k) {     int i = lo, j = hi, pi = a[lo];     while (i < j) {         while (i < hi && a[i] >= pi) i++;// 一个是hi,         while (lo < j && a[j] < pi) j--;// 一个是lo         if (i < j) swap(a, i, j);     }     swap(a, lo, j);     if (j == k) return j;     else if (j < k) return quickSelect(a, j + 1, hi, k);     else return quickSelect(a, lo, j - 1, k);  }  void swap(int[] a, int i, int j) {    int tmp = a[i];    a[i] = a[j];    a[j] = tmp;  }}

289. Game of Life

要求:实现生命游戏的下一个状态,这个是规则实现的一个典型。
思路:注意先用temp缓存下当前的状态

数组删除数

283. Move Zeroes

要求:数组中删除的0元素,
错误:注意后面补0的操作

26. Remove Duplicates from Sorted Array

要求:删除数组中重复的元素
思路:注意每次作比较的对象

27. Remove Element

相同的方式

数组找数

448. Find All Numbers Disappeared in an Array

要求:数组,元素为正,不大于数组长度, 有的出现一次,有的出现两次,返回未出现的,利用取反的思想

442. Find All Duplicates in an Array

要求:数组同上,返回所有出现两次的,思路同上

287. Find the Duplicate Number

要求:不修改原数组内容
思路:根据链表有环的思路解,修改的话直接取负值

136. Single Number

要求:其他数出现两次,一个数出现一次,找出来
思路:异或,初始值为0

137. Single Number II

要求:一个数出现3次,其他的出现1次,找出这个出现一次的数
无思路:32*nums.length,对每一位进行操作

260. Single Number III

要求:数组中除了两个数出现一次,其余都出现两次
思路:先确定两个数里面的不同的位,也就是取出最右侧1,diff = diff & ~(diff - 1)

389. Find the Difference

要求:s比t在任意位置少一个字符,输出这个字符
思路:位操作类似

41. First Missing Positive

要求:数组中的数有正有负,找出第一个丢失的正数
思路:移动数到正确的位置,然后从头开始找
错误:注意每次移动的时候的while操作

268. Missing Number

数组中的数从0到n,采用每一个数下标以及当前数进行异或

238. Product of Array Except Self

要求:计算数组乘法,除了它自己,从两头开始乘
思路:各自从一边开始进行乘法

152. Maximum Product Subarray

要求:给定一个有正有负的数组,输出子数组最大的乘积值
思路:因为存在正负,所以缓存了最大值与最小值

雨水搜集三问题

11. Container With Most Water

要求:给定数组,代表不同位置的高度,输出最多得到多少水, 用两个边代表高度
思路:两边向中间, bugfree

42. Trapping Rain Water

要求:当前的容器,可以收集多少雨水
思路:同上, 但是采用的是结果的累加

407. Trapping Rain Water II

要求:二维的数组进行收集
思路:这个采用优先队列来做,
错误:加入边界点的时候没对visit进行更新

找数问题

169. Majority Element

有一个数出现次数超过一半,用投票的方法

229. Majority Element II

要求:找出出现次数大于1/3的数,返回链表
思路:排序, 先用投票选出前两个,然后再统计数量

数组interval问题

228. Summary Ranges

要求:给定一个数组,总结下,从多少到到少
思路:基于规则编程,bugfree

352. Data Stream as Disjoint Intervals

要求:给定输入流,每一次都得到当前的总结值
思路:AC,采用的是treemap

57. Insert Interval

要求:给定一个升序的链表,自己合并,每一个元素都有一个其实和终止
思路:分三步进行,1前面小的点扔掉,2合并重叠部分,3后面不影响的加上

56. Merge Intervals

要求:与上面表示的一样,区间的合并
错误:区间一开始是无顺序的,后来需要进行合并处理

数组重复三问题

217. Contains Duplicate

判断是否有重复set

219. Contains Duplicate II

要求:判断是否存在重复,i和j的差距最大为k
思路:每当新加入一个数,删除另外一个对应下标

220. Contains Duplicate III

要求:此处多加了一个限制条件,既要保证两者差值不大于t,也要保证下标差值不大于k(删除桶可以保证),用桶的思想,m表示桶的下标
错误:本身没有思路,注意构建

数字组合

39. Combination Sum

要求:数组里面的数组成特定的值,组合中不能出现重复, 本身可选数组
思路:注意start数值防止重复利用

40. Combination Sum II

要求:数组中的数据存在重复,需要进行去重处理
思路:加上一行数据即可
错误:if(i > start && candidates[i] == candidates[i-1]) continue; /** skip duplicates */

216. Combination Sum III

要求:给定k跟n,利用k个1到9不重复的数组成n,输出可行解
dfs的时候加上k的条件限制

377. Combination Sum IV

要求:输出的是可行解的数量,完全背包问题
思路:这个是要结果数量而不是具体结果,dp来解

209. Minimum Size Subarray Sum

要求:找到数组中最小的长度,使得累加和大于或者等于给定值
双指针

189. Rotate Array

要求:旋转数组,两个方法

数组二分查找问题

之前整理过,参考二分法

几个sum小结

1. Two Sum

简单的使用map做一个缓存,然后进行操作

167. Two Sum II - Input array is sorted

要求:原数组已经排序,得到相关的,从两边开始,形同二分,但是不是二分

15. 3Sum

要求:给定一个数组,找出其中三个数,加起来等于0
思路:注意重复的元素,类似二分的思路

16. 3Sum Closest

要求:思路同上

18. 4Sum

建立在3sum的基础上

454. 4Sum II

要求:四个数组, 每个数组分别挑出来1个数,求出累加和 用map进行缓存

128. Longest Consecutive Sequence

要求:输出最长的连续数组的长度,利用set

三角形数组

120. Triangle

要求:从三角形顶端出发,到底端,最少的路径值
思路:三角形dp,

118. Pascal’s Triangle

按照规则编程

119. Pascal’s Triangle II

同上

数组元素构造树

105. Construct Binary Tree from Preorder and Inorder Traversal

错误,在统计id的时候出现错误,计算出一边,然后计算另外一边

106. Construct Binary Tree from Inorder and Postorder Traversal

88. Merge Sorted Array

错误:下标出现了问题

计算面积的3道题

84. Largest Rectangle in Histogram

直方图的面积,用stack来做,里面放入的是下标

221. Maximal Square

要求:最大的面积,利用dp来做

85. Maximal Rectangle

同上

单词查找的两道题

要求:给定一个字符串,同时给定一个二维字符数组,判断能否由连续的数组成
dfs,注意每一个都可以作为一个开头,在处理的时候可以采用#号

212. Word Search II

要求:给定一个字符串数组,确定当前二维字符数组可以组成多少个,既可以一个一个做,
最快的还是利用单词查找树 ,非常优美的代码

75. Sort Colors

一共三个颜色,从两边开始

73. Set Matrix Zeroes

如果出现0,那么进行行清零,列清零

64. Minimum Path Sum

二维坐标dp,

174. Dungeon Game

要求:王子拯救公主,
错误:初始化出现了问题。同时,因该采用减法,这样可以判断出是否损失血液

螺旋数组的两道题目

54. Spiral Matrix

要求:给定一个数组,从外到内,螺旋输出数组的值
思路:定义四个参数,分别为rowbeg,rowend,colbeg,colend,在下面向左和左面向上需要加上条件判断,

59. Spiral Matrix II

要求:给定一个数,发挥一个旋转数组
思路:与上面的一样,因为是n*n的,不用加条件限制,上面的要加条件限制

48. Rotate Image

要求:顺时针旋转,
思路:先行交换,然后取对称矩阵

53. Maximum Subarray

至少2次面试的时候考到,数组中的数有正有负

数组排列组合问题

31. Next Permutation

给定一个数组,找出下一个排列组合,从右往前找,寻找,寻找,交换,排序

46. Permutations

要求:输出全部组合的不同的排列形式,输入本身无重复
思路:backtracking,根据下标值设定访问标志

47. Permutations II

要求:同上,本身存在重复
思路:点睛之笔:if (used[i] || (i > 0 && nums[i] == nums[i - 1] && !used[i - 1])) continue;

60. Permutation Sequence

要求:给定一个整数,表明组成元素的限定范围,另外一个元素k,表明输出第k个结果
思路:dp的temp和 list组合

0 0