LeetCode
文章平均质量分 62
zhumqs
这个作者很懒,什么都没留下…
展开
-
LeetCode------Maximum SubArray
解法1分治法Divide and Conquer Approach来解,这个分治法的思想就类似于二分搜索法,我们需要把数组一分为二,分别找出左边和右边的最大子数组之和,然后还要从中间开始向左右分别扫描,求出的最大值分别和左右两边得出的最大值相比较取最大的那一个,代码如下:/* * 分治法的思想就类似于二分搜索法,我们需要把数组一分为二, * 分别找出左边和右边的最大...原创 2018-09-06 20:22:52 · 146 阅读 · 0 评论 -
LeetCode------First Missing Positive
HashSet这道题让我们找缺失的首个正数,由于限定了O(n)的时间,所以一般的排序方法都不能用,最开始我没有看到还限制了空间复杂度,所以想到了用HashSet来解,这个思路很简单,第一遍遍历数组把所有的数都存入HashSet中,并且找出数组的最大值,下次循环从1开始递增找数字,哪个数字找不到就返回哪个数字,如果一直找到了最大的数字,则返回最大值+1,代码如下: //使用ha...原创 2018-09-01 22:10:35 · 137 阅读 · 0 评论 -
LeetCode------Kth Largest Element in an Array
快排partition这道题最好的解法应该是用快速排序Quick Sort的思想,这里排序的方向是从大往小排,核心思想是每次都要先找一个中枢点Pivot,然后遍历其他所有的数字,这里要求第k大,就把大于中枢点的数字放到左半边,把小于中枢点的放在右半边,这样中枢点是整个数组中第几大的数字就确定了,虽然左右两部分不一定是完全有序的,但是并不影响本题要求的结果,所以我们求出中枢点的位置,如果...原创 2018-09-01 16:42:14 · 137 阅读 · 0 评论 -
LeetCode------Sort Colors
1、计数排序 //计数排序:两边扫描,第一遍计数,第二遍给数组重新赋值 public void sortColors(int nums[]) { int counts[] = new int[3]; //计数 for(int i = 0;i<nums.length;i++) { counts[num...原创 2018-09-01 15:20:22 · 186 阅读 · 0 评论 -
LeetCode------Sort List
// Sort List// 归并排序,时间复杂度O(nlogn),空间复杂度O(1)package com.zhumq.lianxi;public class SortListUseMergeSort { public class ListNode{ private int val; private ListNode next; ...原创 2018-09-01 14:17:39 · 177 阅读 · 0 评论 -
LeetCode------Merge k Sorted Lists
// Merge k Sorted Lists// 时间复杂度O(n1+n2+...),空间复杂度O(1)// TODO: 会超时public class Solution { public ListNode mergeKLists(ListNode[] lists) { if (lists.length == 0) return null; ...原创 2018-09-01 13:16:16 · 134 阅读 · 0 评论 -
LeetCode------Merge Two Sorted Lists
混合插入有序链表和混合插入有序数组非常的相似,仅仅是数据结构由数组换成了链表而已,代码写起来反而更简洁。具体思想就是新建一个链表,然后比较两个链表中的元素值,把较小的那个链到新链表中,由于两个输入链表的长度可能不同,所以最终会有一个链表先完成插入所有元素,则直接另一个未完成的链表直接链入新链表的末尾。代码如下: // Merge Two Sorted Lists // 时...原创 2018-09-01 12:53:02 · 135 阅读 · 0 评论 -
LeetCode------Merge Two Sorted Arrays
混合插入有序数组,由于两个数组都是有序的,所有只要按顺序比较大小即可。最先想到的方法是建立一个m+n大小的新数组,然后逐个从A和B数组中取出元素比较,把较小的加入新数组,然后在考虑A数组有剩余和B数组有剩余的两种情况,最后在把新数组的元素重新赋值到A数组中即可。这样固然没错,但是还有更简洁的方法,而且不用申请新变量。算法思想是:由于合并后A数组的大小必定是m+n,所以从最后面开始往前赋值,...原创 2018-09-01 12:31:56 · 245 阅读 · 0 评论 -
LeetCode------Insertion Sort List
链表的插入排序实现原理很简单,就是一个元素一个元素的从原链表中取出来,然后按顺序插入到新链表中,时间复杂度为O(n2),是一种效率并不是很高的算法,但是空间复杂度为O(1),以高时间复杂度换取了低空间复杂度。代码如下:package com.zhumq.lianxi;public class InsertionSortList { public class ListNode...原创 2018-09-01 12:23:46 · 143 阅读 · 0 评论 -
LeetCode------LCA of Binary Tree
这道求二叉树的最小共同父节点的题是之前那道Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最小共同父节点的Follow Up。跟之前那题不同的地方是,这道题是普通是二叉树,不是二叉搜索树,所以就不能利用其特有的性质,所以我们只能在二叉树中来搜索p和q,然后从路径中找到最后一个相同的节点即为父节点,我们可以用递归来实现,在递归函数中,我们...原创 2018-08-21 16:15:59 · 245 阅读 · 0 评论 -
LeetCode------H-Index
先排序 // H-Index // Time complexity: O(nlogn), Space complexity: O(1) public int hIndex(int[] citations) { //使用sort对数组从小到大排序 Arrays.sort(citations); //翻转数组,使...原创 2018-09-01 23:13:28 · 217 阅读 · 0 评论 -
LeetCode------Maximum Gap
1、桶排序 (1)首先找出数组的最大值和最小值; (2)然后要确定每个桶的容量,即为(最大值 - 最小值) / 元素个数 + 1; (3)在确定桶的个数,即为(最大值 - 最小值) / 桶的容量 + 1, (4)对于数组中的任意整数k,通过算式index = (k - 最小值) / 桶的容量找出其桶的位置; (5)然后需要在每个桶中找出局部最大值和最小值,最大间距的两个数不会在同...原创 2018-09-02 17:12:05 · 236 阅读 · 0 评论 -
LeetCode------Reverse Linked List
解法1:头插法算法思路:依次取原链表中的每一个节点,将其作为第一个节点插入到新链表中,指针用来指向当前节点,p为空时结束。 /* * 解法1: 头插法,原链表上直接操作 */ public LinkNode reverse3(LinkNode head) { //链表为空或者仅1个数直接返回 if(head == nu...原创 2018-09-11 11:28:31 · 196 阅读 · 0 评论 -
LeetCode------H-Index II
这题是之前那道H-Index 求H指数的拓展,但基本思路是一样的,H-Index思路: 只不过这里现在给的数组是升序的,所以这里我们只需要变化一下坐标即可。在O(log n)的时间内完成计算应该有很敏锐的意识应该用二分查找法,首先初始化left和right为0和数组长度n,然后取中间值mid,比较citations[mid]和n-mid做比较,如果前者大,则right移到mid之前,反之...原创 2018-09-06 14:47:14 · 258 阅读 · 0 评论 -
LeetCode------Find Minimum in Rotated Sorted Array II
具体的例子比如4 5 6 7 0 1 2 从中间断开后,它是由一个有序跟一个无序的序列组成的。 如果left = 0, right = 6,mid = 3, 那么4,,5, 6, 7是正序, 7, 0, 1, 2是逆序,所以我们要丢掉左边。这样反复操作,直到数列中只有2个数字,就是断开处,这题我们会得到7,0,返回后一个就可以了。当元素可以重复出现时:如果发现 A.mid ...原创 2018-09-06 12:28:20 · 182 阅读 · 0 评论 -
LeetCode------Find Minimum in Rotated Sorted Array
通过直接遍历整个数组来寻找过于简单粗暴,这样的话,旋不旋转就没有意义。应该考虑将时间复杂度从简单粗暴的O(n)缩小到O(logn),这时候就需要用到二分查找法。首先要判断这个有序数组是否旋转了,通过比较第一个和最后一个数的大小,如果第一个数小,则没有旋转,直接返回这个数。如果第一个数大,就要进一步搜索。我们定义left和right两个指针分别指向开头和结尾,还要找到中间那个数,然后和left指...原创 2018-09-05 21:05:30 · 143 阅读 · 0 评论 -
LeetCode------Madian of Two Sorted Arrays
这是一道非常经典的题。这题更通用的形式是,给定两个已经排序好的数组,找到两者所有元素中第 k 大的元素,只不过这道题是求中位数。解法一直接合并两个数组,然后求第 k 大的元素,O(m+n) 的解法比较直观。解法二我们仅仅需要第 k 大的元素,是不需要“排序”这么昂贵的操作的。可以用一个计数器,记录当前已经找到第m大的元素了。同时我们使用两个指针 pA 和 pB ,分别指向A...原创 2018-09-05 19:43:14 · 187 阅读 · 0 评论 -
LeetCode------Largest Number
这道题和剑指offer面试题33:把数组排成最小的数一样思路。就是要找到一种排序规则,数组根据这个规则排序之后能排成一个最大的数字。要确定这个规则,就要比较2个数字:给出m和n,我们需要确定规则来判断m和n那个应该排在前面,而不仅仅是比较这两个数字哪个更大。为防止拼接后的数字溢出,我们使用字符串来处理。把m和n拼接成的mn和nm按照字符串大小的比较规则来处理即可。如果mn < n...原创 2018-09-03 14:04:31 · 171 阅读 · 0 评论 -
LeetCode------Search a 2D Matrix II
在用暴力求解时,从第一行第一列开始查找,查找时按行优先,由于数组向下和向右时递增的,故如果从第一行第一列查找如果target比当前元素大,那么向下走和向右走都是可以的,这样很麻烦,但是如果从左下角或右上角开始查找,问题就变得简单了,以从左下角开始查找为例,如果当前元素比target大,那么就往上走;如果target比当前元素小,就往右走。如果走出了这个矩阵还没有找到target那么返回fals...原创 2018-09-05 16:12:27 · 166 阅读 · 0 评论 -
LeetCode------Search in Rotated Sorted Array II
package com.zhumq.lianxi;public class SearchinRotatedSortedArrayII { // Search in Rotated Sorted Array II // Time Complexity: O(n),Space Complexity: O(1) public boolean search(int[] ...原创 2018-09-05 15:22:13 · 180 阅读 · 0 评论 -
LeetCode------Search in Rotated Sorted Array
用题目中给的例子来分析,对于数组[0 1 2 4 5 6 7] 共有下列七种旋转方法: 二分搜索法的关键在于获得了中间数后,判断下面要搜索左半段还是右半段,观察上面数字,可以得出规律,如果中间的数大于或等于最左边的数,则左半段是有序的,若中间数小于最左边数,则右半段是有序的,我们只要在有序的半段里用首尾两个数组来判断目标值是否在这一区域内,这样就可以确定保留哪半边了,代码如下:pac...原创 2018-09-05 15:17:53 · 206 阅读 · 0 评论 -
LeetCode------Search Insert Position
最简单的解法只需要遍历一遍原数组,若当前数字大于或等于目标值,则返回当前坐标,如果遍历结束了,说明目标值比数组中任何一个数都要大,则返回数组长度n即可,代码如下:class SearchInsertPosition { public int searchInsert(int[] nums, int target) { for (int i = 0; i < n...原创 2018-09-05 15:03:22 · 187 阅读 · 0 评论 -
LeetCode------Search for a Range
解法一这道题让我们在一个有序整数数组中寻找相同目标值的起始和结束位置,而且限定了时间复杂度为O(logn),这是典型的二分查找法的时间复杂度,所以这道题我们也需要用此方法,我们的思路是首先对原数组使用二分查找法,找出其中一个目标值的位置,然后向两边搜索找出起始和结束的位置,代码如下: //先找到一个目标值的位置,再左右搜索找到起始位置 public int[] s...原创 2018-09-05 14:58:19 · 148 阅读 · 0 评论 -
LeetCode------Populating Next Right Pointers in Each Node
这道题实际上是树的层序遍历的应用,既然是遍历,就有递归和非递归两种方法。下面先来看递归的解法,由于是完全二叉树,所以若节点的左子结点存在的话,其右子节点必定存在,所以左子结点的next指针可以直接指向其右子节点,对于其右子节点的处理方法是,判断其父节点的next是否为空,若不为空,则指向其next指针指向的节点的左子结点,若为空则指向NULL,代码如下: //solution1:...原创 2018-08-21 14:49:46 · 195 阅读 · 0 评论 -
LeetCode------Binary Tree Maximum Path Sum
求二叉树的最大路径和是一道蛮有难度的题,难就难在起始位置和结束位置可以为任意位置,我当然是又不会了,于是上网看看大神们的解法,像这种类似数的遍历的题,一般来说都需要用DFS来求解,我们先来看一个简单的例子: 由于这是一个很简单的例子,我们很容易就能找到最长路径为7-11-4-13,那么怎么用递归来找出正确的路径和呢?根据以往的经验,树的递归解法一般都是递归到叶节点,然后开始边处理边回溯到...原创 2018-08-21 13:23:29 · 177 阅读 · 0 评论 -
LeetCode------LRU Cache
为什么hashmap在o(1)时间能查找到节点? 根据查找的内容直接得到数组的下标,所以 时间是o(1)。 示例代码Java中也有双向链表 LinkedList , 但是 LinkedList 封装的太深,没有能在 O(1) 时间内删除中间某个元素的API(C++的 list 有个 splice() , O(1), 可以直接使用 splice() ),于是我们只能自己实...原创 2018-08-20 21:34:34 · 172 阅读 · 0 评论 -
LeetCode-----Construct Binary Tree from Inorder and Postorder Traversal
Construct Binary Tree from Inorder and Postorder Traversal 描述 Given inorder and postorder traversal of a tree, construct the binary tree. Note: You may assume that duplicates do not exist in the tr...原创 2018-08-16 16:57:11 · 211 阅读 · 0 评论 -
LeetCode(十)------Next Permutation
描述: Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest poss...原创 2018-08-08 19:08:17 · 170 阅读 · 0 评论 -
LeetCode(九)------Move Zeroes
描述: Given an array nums , write a function to move all 0’s to the end of it while maintaining the relative order of the non-zero elements. For example, given nums = [0, 1, 0, 3, 12] , after calling...原创 2018-08-08 18:27:50 · 136 阅读 · 0 评论 -
LeetCode(八)------Remove Element
描述: Given an array and a value, remove all instances of that value in place and return the new length. The order of elements can be changed. It doesn’t matter what you leave beyond the new length. ...原创 2018-08-08 18:22:35 · 104 阅读 · 0 评论 -
LeetCode(七)------4Sum
描述: Given an array S of n integers, are there elements a, b, c , and d in S such that a + b + c +d = target ? Find all unique quadruplets in the array which gives the sum of target. Note: Elements...原创 2018-08-08 17:02:11 · 133 阅读 · 0 评论 -
LeetCode(六)------3Sum Closest
描述: Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have e...原创 2018-08-08 16:43:55 · 156 阅读 · 0 评论 -
LeetCode(五)------3Sum
描述: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0 ? Find all unique triplets in the array which gives the sum of zero. Note: Elements in a triplet (a,b,...原创 2018-08-08 16:21:39 · 138 阅读 · 0 评论 -
LeetCode(四)------Two Sum
描述: Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target,...原创 2018-08-08 15:44:28 · 149 阅读 · 0 评论 -
LeetCode(三)------Longest Consecutive Sequence
描述: Given an unsorted array of integers, find the length of the longest consecutive elements sequence. For example, Given [100, 4, 200, 1, 3, 2] , The longest consecutive elements sequence is [1, 2...原创 2018-08-08 15:21:09 · 169 阅读 · 0 评论 -
LeetCode(二)------Remove Duplicates from Sorted Array II
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I...原创 2018-08-08 15:01:39 · 135 阅读 · 0 评论 -
LeetCode-----Construct Binary Tree from Preorder and Inorder Traversal
Construct Binary Tree from Preorder and Inorder Traversal 描述 Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume that duplicates do not exist in the tree...原创 2018-08-16 16:57:40 · 173 阅读 · 0 评论 -
LeetCode-----Unique Binary Search Trees
可以用迭代和递归两种方法求解,实例代码如下所示:package com.zhumq.lianxi;import org.junit.Test;public class UniqueBinarySearchTree { //迭代解法 public static int numTrees(int n) { //有n个元素但是从0开始的所以定义...原创 2018-08-16 16:58:48 · 162 阅读 · 0 评论 -
LeetCode-----Unique Binary Search Trees II
需要将所有的二叉搜索树都构建出来,思路还是跟前面1的一样,找到一个数作为根结点,剩余的数分别划入左子树或者右子树,用递归来实现。 实例代码如下:package com.zhumq.lianxi;import java.util.ArrayList;import java.util.List;public class UniqueBinarySearchTreeII {...原创 2018-08-16 16:59:16 · 119 阅读 · 0 评论 -
LeetCode------Path Sum II
用深度优先搜索DFS,只不过数据结构相对复杂一点,需要用到二维的集合,而且每当DFS搜索到新节点时,都要保存该节点。而且每当找出一条路径之后,都将这个保存为一维集合的路径保存到最终结果二维集合中。并且,每当DFS搜索到子节点,发现不是路径和时,返回上一个结点时,需要把该节点从一维集合中移除。递归解法// Path Sum II// 时间复杂度O(n),空间复杂度O(logn)p...原创 2018-08-20 18:33:43 · 277 阅读 · 0 评论