- 博客(27)
- 资源 (4)
- 收藏
- 关注
原创 Pascal's Triangle II
帕斯卡三角:11 11 2 11 3 3 11 4 6 4 1。。。。要求只允许O(k)空间每增加一层ArrayList就增加一个1在每一层,从第二个数开始修改,直至修改到倒数第二个数,在修改之前要把原来的值保存,以备下次相加public ArrayList getRow(int rowIndex) { Ar
2014-01-27 13:21:22 400
原创 Remove Duplicates from Sorted Array II
与Remove Duplicates from Sorted Array不同的是:如果len遍历数组的过程中,删除数的条件是连续三个数相等,删除最后一个数,并且前移后面的数;如果不符合这个条件,才继续向前遍历,否则继续比较。public int removeDuplicates(int[] A) { int len = A.length; if(le
2014-01-26 21:07:52 376
原创 Convert Sorted Array to Binary Search Tree
把一个有序序列转化为平衡二叉排序树用递归,类似二分构建,找到middle,作为根节点public TreeNode sortedArrayToBST(int[] num) { int len = num.length; TreeNode root = build(num,0,len-1); return root; }
2014-01-26 20:27:55 442
原创 Populating Next Right Pointers in Each Node和 II
二叉树层次遍历的变种用辅助队列,一层一层地遍历每一层的元素,先出队的元素的next是后一个出队的元素每一层最后一个元素的next=nullpublic void connect(TreeLinkNode root) { Queue Q = new ArrayDeque(); if(root == null)return; Q.offer(
2014-01-26 19:51:15 503
原创 Plus One
思路:1.如果最后一位小于9,则digits[length-1]++,返回2.如果最后一位大于8,则循环访问数组,直至某位数3.如果最后得到的进位>0,则需要将数组长度扩大1,原来的数组往后平移public int[] plusOne(int[] digits) { int length = digits.length; int add = 0,i
2014-01-26 15:57:11 468
原创 Search a 2D Matrix
典型的二分法查找,注意循环条件是lowpublic boolean searchMatrix(int[][] matrix, int target) { int row = matrix.length; if(row == 0)return false; int column = matrix[0].length; int cou
2014-01-24 19:49:41 420
原创 Binary Tree Level Order Traversal II
在层次遍历的基础上,反转ArrayList>就可以了public ArrayList> levelOrderBottom(TreeNode root) { ArrayList> lists = new ArrayList>(); if(root == null)return lists; Queue Q = new ArrayDeque(
2014-01-23 16:38:04 462
原创 Java容器类常用方法总结
1.容器遍历最常用的是Iterator,用foreach简写ArrayList> lists = new ArrayList>();遍历它为:for(ArrayList it: lists){for(Integer iti :it){System.out.print(iti+" ");}System.out.println();}2.栈的初始化,出栈,入
2014-01-23 16:15:47 833
原创 股票交易类算法
求一组数中最大差问题(只能是后面的数减前面的数)暴力n2,显然不行可以转化一下思路,求出两两相邻数的差,求一系列差值的最大连续子序列和,问题就转化为Maximum Subarray问题注意两点:收益不能为负,所以如果求出来的值小于0,输出0如果给出的数组只有一个数,也输出0public int maxProfit(int[] price
2014-01-23 12:27:31 834 1
原创 Longest Substring Without Repeating Characters
定义两个数组,一个boolean[],记录是否出现过这个字符,一个int[],记录该字符上一次出现的位置,数组下标是字符的ASCII码设置一个begin指针,每次遇到相同字符时,begin重新置为i;特别注意,遇到相同字符时,就要重新计算长度,所以从上一次begin到这个字符上一次出现的位置,这之间的字符布尔数组应该设置为falsepublic int lengthOfLongestS
2014-01-19 20:37:52 456
原创 Climbing Stairs
经典dp问题 设置一个数组dp[i]表示i层楼梯有多少种方法dp[1]=1;dp[2]=2;dp[i]=dp[i-1]+dp[i-2];i层楼梯最后时,要么走一步,要么走两步,所以有上面的等式最后返回dp[n]public int climbStairs(int n) { if(n == 0 || n==1)return n; int
2014-01-19 16:22:53 407
原创 Remove Duplicates from Sorted List
遍历list,如果遇到相等的数,就删除那个节点,否则指针前移public ListNode deleteDuplicates(ListNode head) { ListNode p = head; while(p != null && p.next!= null){ if(p.val == p.next.val)p.next=p.nex
2014-01-19 16:06:27 427
原创 Length of Last Word
很简单,按“ ”分割就可以了,Java中有s.split()函数public int lengthOfLastWord(String s) { String[] strArray = s.split(" "); if(strArray.length == 0)return 0; return strArray[strArray.length-1]
2014-01-19 15:47:38 455
原创 面试题17:合并两个有序链表(Leetcode-21:Merge Two Sorted Lists)
思路与合并两个有序数组是一样的,重新建立一个node l3,同时遍历l1和l2,比较小的数就插入到l3的表尾,然后小的数指针后移。不同的是,在遍历之前,得要先建立l3的头结点,也就是比较l1和l2的头结点数值大小,小的数作为l3的头结点。public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode
2014-01-19 15:34:51 634
原创 面试题31:连续子数组的最大和(Leetcode-53:Maximum Subarray)
经典DP问题,用max变量存储先前得到的子数组的和注意四点:1. 每次循环 sum += A[i]2. 如果sum>max ,则将max置为sum3. 如果sum因为如果sum4.max的初始值必须是int型的最小值,也就是Integer.MIN_VALUE,因为需要和sum比较 public int maxSubArray(int[] A) { int l
2014-01-19 12:07:02 547
原创 面试题2:实现单例模式
单例模式的三个特点:1,该类只有一个实例2,该类自行创建该实例(在该类内部创建自身的实例对象)3,向整个系统公开这个实例接口根据以上特点,实现单例模式的方法是:(1)私有构造函数(private)(2)私有静态成员变量(private,static)(3)公有静态函数(public,static getInstance())两种形式:饿汉式单例类,懒汉式单例类懒汉...
2014-01-18 19:38:58 642
原创 Search Insert Position
就是一个二分查找的问题public int searchInsert(int[] A, int target) { int high = A.length-1; int low = 0,middle=0; while(low <= high){ int midindex = (low+high)/2;
2014-01-18 17:34:06 453
原创 Best Time to Buy and Sell Stock II
就是求所有上升期差价的总和犯了很低级的错误,i++与i+1,i++会改变i的值,所以在数组下标中不能用i++!!!public int maxProfit(int[] prices) { int length = prices.length; int ret = 0; for(int i = 0;i<length-1;i++){
2014-01-18 15:23:49 532
原创 Single Number
一组数中,只有一个数出现一次,其他数都出现了2次,找到这个数方法一:用map,key是这个数,value用作统计这个数出现的次数遍历map的key,输出value=1的那个keypublic int singleNumber(int[] A) { int length = A.length; Map map = new HashMap(); for(
2014-01-18 13:54:10 452
原创 Same Tree
思路:分类讨论,递归public boolean isSameTree(TreeNode p, TreeNode q) { return isSameTreeUtil(p,q); } boolean isSameTreeUtil(TreeNode p, TreeNode q){ if(p==null && q==null){
2014-01-17 17:32:39 420
原创 观察者模式
案例:观察者Observer对被观察者Observered进行监控,一旦被观察者发生变化,观察者发出提示1.写观察者接口和类,一个接口IObserver和实现这个接口的Observer的类。接口有一个方法:doSth(),表明观察者发现被观察者发生变化时,就发出提示public interface IObserver { public void doSth();}public c
2014-01-17 16:52:58 564
原创 代理模式及Java动态代理
以老板和秘书之间的代理关系,处理事务,秘书作为老板的代理人,可以接电话。1.首先写一个Handle接口,接口里有一个方法:接电话public interface Handle { public void answerPhone(); }2.分别创建两个类:老板类和秘书类,都实现了Handle接口2.1老板类重写了接电话的方法public class Boss implement
2014-01-17 16:41:10 600
原创 面试题16:单链表逆置
思路如下图所示:代码:Node reverse(Node head){ if(null == head || null == head.next ){//如果链表为空或只有一个元素 return head; } Node p = head.next; head.next = null;//原来的头节点成了表尾 Node temp = null; whi
2014-01-16 23:04:22 584
原创 Word Break
For example, givens = "leetcode",dict = ["leet", "code"].Return true because "leetcode" can be segmented as "leet code".第一种解法:递归。结果超时!!!public boolean wordBreak(String s, Set dic
2014-01-14 18:28:00 409
原创 Java实现单链表
首先定义一个节点类,有两个成员变量:val和next,以及一个构造函数:/* * 单链表非数组实现 */public class ListNode { ListNode next; int val; ListNode(int val){ this.val = val; this.next = null; }}单链表最常用的两个方法就是插入和删除:public s
2014-01-13 14:32:20 590
原创 ZigZag Conversion 锯齿形转换字符串
思路:根据锯齿形状,可以得到结论第i行的字符下标之间的距离是(nRows-1-i)*2和2*i,如下图所示:0 61 5 72 4 83 9根据这个规律,遍历每一行的元素,得到转换后的字符串。注意两点:1. 当s.length 时,无需转换,直接返回,否则会超时。2. 在遍历每一行时,
2014-01-11 15:56:29 895
原创 判断链表是否有环以及寻找环入口
思路:采用“快慢指针”查检查链表是否含有环。让一个指针一次走一步,另一个一次走两步,如果链表中含有环,快的指针会再次和慢的指针相遇。这里需要注意的一点是算法中循环的条件,这是一个很容易被忽略的细节。1)因为fast指针比slow指针走得快,所以只要判断fast指针是否为空就好。由于fast指针一次走两步(走得太快了,就容易跌倒!),fast.next可能已经为空(当fast为尾
2014-01-11 14:58:30 494
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人