随笔分类 -  JAVA数据结构

JAVA实现常见数据结构
摘要:这道题可以用贪心算法和动态规划来解,贪心算法思路:先按照每个数组最右值大小排序,我们需要尽量找右边值最小数组作为保留的数组(这样可以留下更多数组),然后在将当前数组的右值和下一个数组的最左值比较。如果合适则加入。动态规划的思路:找以每个区间作为结尾的最大区间数。 public int eraseOv 阅读全文
posted @ 2021-10-25 22:16 毅毅毅毅毅 阅读(46) 评论(0) 推荐(0)
摘要:这道题可以直接暴力法解出答案,但是如果对时间有要求,可以对每一行使用二分进行查找。 public boolean searchMatrix(int[][] matrix, int target) { for (int[] row : matrix) { int index = search(row, 阅读全文
posted @ 2021-10-25 00:49 毅毅毅毅毅 阅读(42) 评论(0) 推荐(0)
摘要:这道题最初没有什么思路,所以算是按暴力来求解,将数组分层,一圈一圈的循环计算,从外圈到内圈。 public int[][] generateMatrix(int n) { int level=n%2==0?n/2:n/2+1; int temp=1; int [][] res=new int [n] 阅读全文
posted @ 2021-10-21 17:20 毅毅毅毅毅 阅读(41) 评论(0) 推荐(0)
摘要:这道题属于Easy题,要求到目标行数,只需要一直递归上一行的内容即可。 public List<Integer> getRow(int rowIndex) { List<Integer> res=new LinkedList<>(); if(rowIndex==0) { res.add(1); re 阅读全文
posted @ 2021-10-19 20:03 毅毅毅毅毅 阅读(34) 评论(0) 推荐(0)
摘要:这道题如果不考虑进阶方法,可以很轻松的使用排序直接得到答案: public void sortColors(int[] nums) { Arrays.sort(nums); } 但如果需要按照进阶的要求,不允许使用自带排序并要求一次遍历,我们可以用双指针进行求解。我们通过两个指针,pre0和pre1 阅读全文
posted @ 2021-10-13 22:12 毅毅毅毅毅 阅读(74) 评论(0) 推荐(0)
摘要:最简单的方法就是:直接排序然后取中间的值,两行搞定 public int majorityElement(int[] nums) { Arrays.sort(nums); return nums[nums.length/2]; } 阅读全文
posted @ 2021-10-12 12:47 毅毅毅毅毅 阅读(76) 评论(0) 推荐(0)
摘要:我们可以知道前一排的数字可以直接影响到后一排的取值,且从第一排开始后,之后的首尾都是1.所以如果暴力的话,也可以直接得到正确结果。 public List<List<Integer>> generate(int numRows) { List<List<Integer>> res=new Linke 阅读全文
posted @ 2021-09-25 14:55 毅毅毅毅毅 阅读(38) 评论(0) 推荐(0)
摘要:对于一个二维数组映射成另一个二维数组,我们可以将二维数组先映射成一个一维数组,然后再将一维数组逐个转为二维数组。 public int[][] matrixReshape(int[][] mat, int r, int c) { int m = mat.length; int n = mat[0]. 阅读全文
posted @ 2021-09-24 20:09 毅毅毅毅毅 阅读(35) 评论(0) 推荐(0)
摘要:该题在两个数组排序后使用双指针求解。 public int[] intersect(int[] nums1, int[] nums2) { Arrays.sort(nums1); Arrays.sort(nums2); int i=0,j=0; List<Integer> res=new Linke 阅读全文
posted @ 2021-09-23 19:07 毅毅毅毅毅 阅读(17) 评论(0) 推荐(0)
摘要:该题较为简单,合并排序即可。 public void merge(int[] nums1, int m, int[] nums2, int n) { List<Integer> res=new ArrayList<>(); for(int i=0;i<m;i++) res.add(nums1[i]) 阅读全文
posted @ 2021-09-21 19:12 毅毅毅毅毅 阅读(41) 评论(0) 推荐(0)
摘要:我们可以创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。 public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> hs=new 阅读全文
posted @ 2021-09-21 17:04 毅毅毅毅毅 阅读(41) 评论(0) 推荐(0)
摘要:动态规划:每次算出以i结尾的连续子串的最大值,之后对dp[i]进行比较就可以得到最长子串。 public int maxSubArray(int[] nums) { int [] dp=new int [nums.length]; int max=nums[0]; dp[0]=nums[0]; fo 阅读全文
posted @ 2021-09-20 17:15 毅毅毅毅毅 阅读(28) 评论(0) 推荐(0)
摘要:法一: 简单的做法就是先排序,再遍历整个数组寻找是否有相同元素。 public boolean containsDuplicate(int[] nums) { Arrays.sort(nums); for(int i=0;i<nums.length-1;i++) { if(nums[i+1]!=nu 阅读全文
posted @ 2021-09-20 16:05 毅毅毅毅毅 阅读(51) 评论(0) 推荐(0)
摘要:1.transient关键字 其实这个关键字的作用很好理解,就是简单的一句话:将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。 2.transient的底层原理 Java的serialization提供了一个非常棒的存储对象状态的机制,说白了serial 阅读全文
posted @ 2021-08-31 09:52 毅毅毅毅毅 阅读(150) 评论(0) 推荐(0)