leetcode
文章平均质量分 54
蕾雨123
自信,勤奋
展开
-
16. 3Sum Closest
题意:给定n个整数的数组S,找出S中最接近目标的3个数的和,返回和。思路:由于题意只需要求和,不需要返回的元素的位置,那么可以先对数组排序,再求和 优化: 1、已经找到3个元素的和为target,停止程序; 2、i : 0->length-3, j: 0->length-2, index = binarySearch原创 2017-02-18 12:09:12 · 288 阅读 · 0 评论 -
2AddTwoNumbers
题意:给出两个链表,非负数字在链表中逆序存放,每个节点存放单个数字,将两个链表中的数字相加然后返回单链表思路 :感觉就是链表的操作,注意进位,还有长度不一样的问题。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next;原创 2016-09-11 18:30:49 · 190 阅读 · 0 评论 -
1TwoSum
题意:给出一个数组,返回和为目标的两个元素下标 可以认为结果有且只有一个【简化的要求,难度系数为easy】思路:最容易想到的是使用双重循环,时间复杂度O(n^2) 空间复杂度O(1),使用数据结构HashMap存放元素值与下标的映射,时间复杂度O(n),空间复杂度O(n) public int[] twoSum(int[] nums, int target) {原创 2016-09-11 17:23:34 · 174 阅读 · 0 评论 -
216CombinationSumIII
题意:找到所有和为n ,k个数的组合,要求k个数只能使用1到9,每个组合中无重复的数字。思路:1、箱子(unique set)中的球数不重复,最好的办法从小到大排列;2 给定前面的箱子中的球数组合,考虑后面的箱子中可能的组合(stack)。思路参考leetcode discusspublic class Solution { //k个箱子,n个球,n个球放到k个箱子(每个箱原创 2016-09-11 16:38:02 · 264 阅读 · 0 评论 -
307RangeSumQueryMutable
题意:给定一个整数数组nums,找到数组小标为i,j(i小于j且包含)之间的元素的和,同时update(i,val)函数将下标为i的元素的值该为val声明:1数组的值只能被update函数修改;2 update和sumRange函数调用分布均匀。原创 2016-09-10 15:21:23 · 181 阅读 · 0 评论 -
322CoinChange
题意:输入:不同面值的硬币数组和总金额,输出:使用最少枚硬币凑成总金额,如果找不到这样的组合,返回-1思路:dynamic procedure,参考http://blog.csdn.net/happyaaaaaaaaaaa/article/details/50976088 public int coinChange(int[] coins, int amount) {原创 2016-07-05 21:30:14 · 331 阅读 · 0 评论 -
367ValidPerfectSquare
题意:输入一个数,判断该数是否是完全平方数(true是,false否),要求不能使用库函数sqrt思路:1、任何一个数都能质因数分解,判断质因子是否成对出现;(超时)O(sqrt(n)) 2、找到a^2 = n中a的值,采用binary search。O(log(n/2)) 3 、递推关系式, x^2 - (x-1)^2 = 2x-1 ,.原创 2016-07-05 20:38:59 · 187 阅读 · 0 评论 -
144BinaryTreePreorderTraversal
题意:给定一颗二叉树,返回该树的中序遍历(先根遍历)要求使用迭代方法,而不用递归思路:先根,左子树(根,左子树,右子树),右子树。。。。数据结构:栈 public List preorderTraversal(TreeNode root) { List seq = new ArrayList(); TreeNode tr = root, pr原创 2016-06-18 20:42:55 · 189 阅读 · 0 评论 -
268MissingNumber
题意: 输入0~n之间的数组(缺少其中一个数),输出缺的那个数思路:1、将从0到n的所有数异或,再和该数组中的数异或得到的数便是缺的那个数;2、0~n利用求和公式,再减去数组的数,即可。原创 2016-06-18 19:22:55 · 215 阅读 · 0 评论 -
191Numberof1Bits
题意:输入一个无符号int,count该数的二进制表达中1的个数思路:建立map映射表(0~15(Ox)--->1的个数)map[16],int:4字节 总计8个0x数,如果将map映射表增大,一次处理一个byte ,map[256,只需4次循环]有点麻烦, public int hammingWeight(int n) { int map[] = new in原创 2016-07-14 17:05:24 · 222 阅读 · 0 评论 -
231PowerofTwo
题意:判断一个数是否是2的幂,类似3的幂的判断思路:2的整数次幂列表 【2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 10485762097152 4194304 8388608 16777216 33554432 67108864 134217728 2684原创 2016-07-14 16:47:22 · 208 阅读 · 0 评论 -
50Pow(x, n)
题意:求x^n,n为long型。思路:(参考leetcode discuss区)1、注意各种类型的范围Math.abs(int n) Note that if the argument is equal to the value of Integer.MIN_VALUE(), the most negative representableint value, the result is原创 2016-07-02 18:51:30 · 217 阅读 · 0 评论 -
318MaximumProductofWordLengths
题意:输入字符串数组,输出找出最大的且不包含相同字符的两串字符串长度的乘积思路:1、比较两个字符串str1、str2是否包含相同的字符 >>> 将两个字符串排序,然后使用游标i,j判断str1[i]、str[j]大小,i++ / j++直至两个字符串结束/str[i]和str[j]相同,时间复杂度O(nlogn + mlogm + m + n) >>>将a-z 26个字符映射到原创 2016-07-02 16:29:42 · 201 阅读 · 0 评论 -
230KthSmallestElementinaBST
题意:输入一棵二叉查找树(bst)(即二叉有序树,左子树思路:中序遍历得到元素的非递减排序,找出第k个元素即可 public int kthSmallest(TreeNode root, int k) { int cur = 1; Stack st = new Stack<>(); TreeNode tp = root; st.原创 2016-07-24 21:49:04 · 205 阅读 · 0 评论 -
326PowerofThree
题意:输入一个数,判断该数是否是3的幂,要求不能使用循环和递归思路:原创 2016-07-13 18:35:49 · 228 阅读 · 0 评论 -
71SimplifyPath
题意:给定一个文件的绝对路径(Unix风格),简化它注意特殊情况:/../返回/,//多个/在一起,去掉多余的/只算一个/思路 正则表达式,以及注意特殊的字符“/..” ,".", "////",后来参考discuss public static String simplifyPath(String path) { Deque stack = new LinkedList<>(原创 2016-09-12 14:32:27 · 227 阅读 · 0 评论 -
329LongestIncreasingPathinaMatrix
题意:输入一个整形数组,找到最长的增序路径,返回路径的长度要求:对于每个单元格,只能向四个方向移动:上、下、左、右,不能移出边界,不能沿对角线方向移动思路:穷举法,数据结构stack,有点类似DFS,从每个位置开始做DFS,搜索到达路径的长度最大值,使用递归(但是超时)。 public int longestIncreasingPath(int[][] matrix) {原创 2016-09-12 16:56:54 · 198 阅读 · 0 评论 -
89GrayCode
题意:格雷码是一种二进制数值系统,两个连续的数值串只相差一位。输入非负整数n表示格雷码的位数,输出从0开始的格雷码序列,声明:其实位数给定的格雷码序列并不唯一,但是测试答案只能测出一种思路:递归,n位->(n-1)位->...2位->1位,数据结构类似stack,使用ArrayList实现,(需要用到下标,元素从栈顶到栈底访问,但是不取出来),而用LinkedList实现更适合元素需要取出原创 2016-09-13 14:37:55 · 160 阅读 · 0 评论 -
150. Evaluate Reverse Polish Notation
题意:使用Reverse Polish Notation计算数学表达式的值,温馨提示:有效的操作符为+、-、*、/,操作数是整数思路:逆序---->后进先出,数据结构:栈原创 2016-12-23 09:46:49 · 292 阅读 · 0 评论 -
92. Reverse Linked List II
题意:将位置m到n处的链表,不要移动元素位置,只走一趟。温馨提示:1思路:修改m->n之间的链接指针,注意保存位置在m-1、n+1处的节点,m为1的情况(加入一个虚的头结点,或者直接把m为1的情况单独拿出来讨论)。 public ListNode reverseBetween(ListNode head, int m, int n) { ListNode pivo原创 2016-12-22 16:32:29 · 205 阅读 · 0 评论 -
31NextPermutation
题意:实现下一个变换,将数字按字典序变换成下一个更大的数字组合,如果不存在这种变换,将它重排成最小的顺序。排放的空间复杂度为O(1)。思路:将数组的元素从右向左看(增序),直到遇到首个逆序(即左边的元素比右边的元素小)(记为左、右元素),找到数组右半部分刚好大于左元素的元素,交换位置,然后将后面的元素变成升序。时间复杂度O(n) public void nextPermutati原创 2016-10-08 17:49:21 · 207 阅读 · 0 评论 -
85MaximalRectangle
题意:输入一个二维元素为0或1的矩阵,找到包含的1最多的矩形,返回该区域思路:从左上角依次以1为矩形左上顶点,水平向右扩展直到遇到首个0位置,如果紧邻的元素是0,则直接放弃从该顶点开始的探索(一条边至少由两个元素组成),然后垂直向下搜索,原则类似水平向右搜索。同时,左上顶点的选择能跳过上一次选择过的的水平区域,即本次选择的左上顶点从0后面的首个1开始,而不用从1开始。注意:矩阵是用字符数组原创 2016-10-07 11:15:12 · 245 阅读 · 0 评论 -
26RemoveDuplicatesfromSortedArray
题意:输入一个有序数组,删除重复元素满足每个元素只出现一次,返回数组的新长度要求:不要为新数组分配空间,空间复杂度为O(1)思路:由于该数组是有序的,重复的元素必定相邻,设置游标表示当前不同的元素,记录不同元素的个数. public int removeDuplicates(int[] nums) { if(nums.length == 0 || nums ==原创 2016-10-02 17:39:28 · 235 阅读 · 0 评论 -
354RussianDollEnvelopes
题意:给定一系列的标有(w, h)的信封,当且仅当一个信封的长和宽都小于另一个信封时,才能装进去。最多能嵌套多少个信封?思路:以w为主序,h为次序将信封排序,当前信封标记为(w, h),找到宽度大于w的信封中且首个高度大于h的信封。数据结构二维数组,一维表示信封数,二维表示(w,h)。 public int maxEnvelopes(int[][] envelopes) {原创 2016-10-17 11:31:17 · 268 阅读 · 0 评论 -
29DivideTwoIntegers
题意:不使用乘法、除法、取模运算,相除 两个整数,如果商溢出,返回MAX_INT思路:能使用加法、减法、移位运算,被除数不断减去除数,直到为不大于0为止,并且判断上是否超过MAX_INT, 优化:除数左移i位,...1位(其中i+1位就大于被除数),直到余数小于除数。注意:除数是2的情况、被除数和除数是Integer.MAX_VALUE、Integer.MIN_VAL原创 2016-10-02 12:01:26 · 214 阅读 · 0 评论 -
14LongestCommonPrefix
题意:找到字符串数组中最长的公共全缀思路:思路将最短的字符串当做哨兵,记录与当前字符串相同的前缀的位置index,直到和数组中的全部字符串比较完成 public String longestCommonPrefix(String[] strs) { if(strs == null || strs.length == 0){ return ne原创 2016-09-27 21:43:51 · 212 阅读 · 0 评论 -
235LowestCommonAncestorofaBinarySearchTree
题意:输入一个二叉查找树(BST),和两个给定节点,在BST中找到这两个节点的最低的共同的祖先(LCA)。温馨提示:wiki对LCA的定义为两个节点的最低的祖先,即两个节点到根的首个交点,LCA用在树(计算两个节点之间的距离,即两个节点到根距离的和减去2被的LCA)或者有向无环图。思路:1、节点的层次,其中,根节点的层次是父节点层次加1(递归定义); 2、使用Ha原创 2016-09-26 10:44:17 · 236 阅读 · 0 评论 -
19RemoveNthNodeFromEndofList
题意:输入一个单链表,删除从链尾开始的第n个节点(从1开始),然后返回头结点声明:n总是有效的,时间复杂度O(n)思路:使用数据结构ArrayList,存放映射关系,扫描一遍单链表,建立每个节点与位序之间的关系,直接将位于倒数(n+1)的next指向倒数(n-1)节点运行出现internal error,刷新网页,成功提交 public ListNode removeNthF原创 2016-09-22 09:22:33 · 324 阅读 · 0 评论 -
297SerializeandDeserializeBinaryTree
题意:序列化是一个过程,将数据结构或者对象转化成位串,以便存进文件、缓冲区或者通过网络传输到对端再进行重构。 设计算法实现二叉树的序列化和降序列化,对算法无性能要求,仅需保证二叉树能被序列化成字符串,同时字符串能被降序列为二叉树。声明:不要使用类的成员、全局、静态的变量去存储状态,因为序列化和非序列化都是针对对象的,是无状态的。思路:类似BFS,数据结构队列,处理父原创 2016-09-21 10:30:00 · 275 阅读 · 0 评论 -
11ContainerWithMostWater
题意:给定n个非负整数a1、a2,...,an,画n条竖线,满足第i条线的终点分别为(i,ai)和(i,0)。找出两条线,和x轴形成一个容器,满足装的水最多。说明:不能倾斜容器。思路:设选中的两条线分别为i,j(i 1、穷举法,依次求面积找最大,运行超时,时间复杂度O(n)2、找规律,距离逐渐减小,短边逐渐变大,求出面积最大值 时间复杂度O(n) {CSDN:CODE:原创 2016-09-20 10:15:29 · 206 阅读 · 0 评论 -
5LongestPalindromicSubstring
题意:输入一个字符串S,找到S中最长的回文子串,题目简化为S的最大长度为1000且只存在唯一的最长回文子串。思路:回文串指正着读反着读结果相同,如“cabac”,以每个位置(回文长度为奇数),两个位置的中间位置(回文长度为偶数),比较回文长度,找到长度最大的回文串(下标start, end表示)。参考https://leetcode.com/articles/longest-palindrom原创 2016-09-19 14:34:40 · 509 阅读 · 0 评论 -
51. N-Queens
题意:n-皇后问题,即将n个皇后放到n*n的棋盘上满足任意两个皇后都不能攻击彼此,皇后一步能攻击其他同行、同列或者同对角线的皇后要求:输入维度整数n,返回n皇后问题的所有不同的方案,每种方案是不同的放置布局,其中‘Q’和‘.’分别表示皇后和 空白空间。思路:1、从结果来看,每列只有一个皇后,每行只有一个皇后。选择从行考虑(或者从列考虑,由对称性知,会得到相同的结果),使用的数据结构stac原创 2016-09-19 09:49:58 · 178 阅读 · 0 评论 -
337HouseRobberIII
题意:小偷偷窃-------二叉树模型,房子----节点, 钱数----节点值, 要求:1、偷得钱数最多;2、不允许偷连续的两家,否则会惊动警察思路:递归算法(树),假设层次从根算起,即1th层,规律:方案1 rob(root,root.left.left/right, root.right.left/right)关注1、3 、5.......;方案2 rob(root.left、root.原创 2016-07-12 21:00:54 · 207 阅读 · 0 评论 -
357CountNumberswithUniqueDigits
题目:输入一个非负整数n,要求输出【0,10^n)之间的符合各位置无重复出现的数字的数个数。思路:排列组合,1、特殊情况,n =0返回2;n=1返回10;2、当n大于2时,如n=5,(((6+1)*7+1)*8+1)*81+10原创 2016-06-14 08:48:12 · 227 阅读 · 0 评论 -
338CountingBits
从1开始,【0】、【1】、【1、2】、【1、2、 2、3】...【2^root, .. 2^root+2^(root-1),.. ,.2^(root+1)】其中【2^root, .. 2^root+2^(root-1)】重复前面一个区间的序列,【2^root+2^(root-1),.. ,.2^(root+1)】是前面的序列的对应的每个值加1;余下不足的一个完整区间长度的部分,分为前半部分原创 2016-05-20 08:36:41 · 176 阅读 · 0 评论 -
292NimGame.java
如果石头的数目是4的整数,则先取者会输;否则,先取者会赢。public class Solution { public boolean canWinNim(int n) { if(n % 4 != 0) return true; else return false; }}原创 2016-05-20 08:55:10 · 299 阅读 · 0 评论 -
136SingleNumber
连连碰的原理,异或配对 2n+1个元素,n对相同的元素相消。int a[]的长度求法: 直接使用a.length或者sizefo(a)/sizeof(int)public class Solution { public int singleNumber(int[] nums) { int res = 0; for(int i = 0;原创 2016-05-20 09:05:00 · 243 阅读 · 0 评论 -
349IntersectionofTwoArrays.java
Integerint, 从左到右使用intValue()转换,从右到左自动转,先排序,在二分查找,使用集合java.util.Arrays改进措施,使用TreeSet(无重复元素),神奇的事情,效率没有什么提高。必须了解java集合框架中各个组件的性能public class Solution { public int[] intersection(int[] nums1,原创 2016-05-20 10:13:35 · 219 阅读 · 0 评论 -
122BestTimetoBuyandSellStockII.java
题目描述:prices[i表示ith天该股股票价格,一天中能买卖多次,但必须先买后卖,卖了之后才能再买进,求最大收益。思路:累积正收益,通过判定相邻两项的差值为正决定购入(-)和卖出(+)public class Solution { public int maxProfit(int[] prices) { //integrate only positive d原创 2016-05-28 21:18:21 · 242 阅读 · 0 评论 -
121BestTimetoBuyandSellStock.java
题目:只能对一支股票进行一次交易,即一次购入和一次卖出,求最大收益思路:找到prices[n]左半部分最小的值,右半部分最大的值,求差值public class Solution { public int maxProfit(int[] prices) { int maxProfit = 0; //O(n) if(prices.length原创 2016-05-28 21:51:53 · 189 阅读 · 0 评论