美文网首页
Leetcode-Java(二十四)

Leetcode-Java(二十四)

作者: 文哥的学习日记 | 来源:发表于2018-06-18 22:25 被阅读53次

231. Power of Two

class Solution {
    public boolean isPowerOfTwo(int n) {
        if(n<=0) return false;
        if(n==1) return true;
        while(n>1){
            int remain = n % 2;
            if(remain != 0) return false;
            n /= 2;
        }
        return true;
    }
}

232. Implement Queue using Stacks

题目中要求只能使用栈的一些基本的功能,所以考虑使用两个栈来模拟一个队列结构。

class MyQueue {

    public Stack<Integer> minStack;
    public Stack<Integer> assiStack;
    /** Initialize your data structure here. */
    public MyQueue() {
        minStack = new Stack<Integer>();
        assiStack = new Stack<Integer>();
    }
    
    /** Push element x to the back of queue. */
    public void push(int x) {
        minStack.push(x);
    }
    
    /** Removes the element from in front of queue and returns that element. */
    public int pop() {
        while(!minStack.empty()){
            assiStack.push(minStack.pop());
        }
        int res = assiStack.pop();
        while(!assiStack.empty()){
            minStack.push(assiStack.pop());
        }
        return res;
    }
    
    /** Get the front element. */
    public int peek() {
        while(!minStack.empty()){
            assiStack.push(minStack.pop());
        }
        int res = assiStack.peek();
        while(!assiStack.empty()){
            minStack.push(assiStack.pop());
        }
        return res;
    }
    
    /** Returns whether the queue is empty. */
    public boolean empty() {
        return minStack.empty();
    }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = new MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.empty();
 */

234. Palindrome Linked List

快慢指针的思路,中间加了一个判断链表是奇数长度还是偶数长度的代码。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        if(head == null) return true;
        Stack<Integer> stack = new Stack<Integer>();
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode slow = dummy;
        ListNode fast = dummy;
        
        while(fast.next!=null && fast.next.next!=null){
            slow = slow.next;
            fast = fast.next.next;
            stack.push(slow.val);
        }
        if(fast.next != null && fast.next.next == null) 
            slow = slow.next;
        while(slow!=null && !stack.empty()){
            slow = slow.next;
            if(stack.pop() != slow.val){
                return false;
            }
        }
        return true;
    }
}

235. Lowest Common Ancestor of a Binary Search Tree

注意题目里是二叉搜索树,所以很容易的根据节点的值写出下面的递归思路。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(p.val == root.val || q.val == root.val || (q.val-root.val) * (p.val-root.val) < 0)
            return root;
        else if(p.val < root.val && q.val < root.val)
            return lowestCommonAncestor(root.left,p,q);
        else
            return lowestCommonAncestor(root.right,p,q);
    }
}

236. Lowest Common Ancestor of a Binary Tree

首先要先确定给的两个node是否都在tree里,如果都在tree里的话,就可以分成3种情况,第一种情况是两个节点是在公共祖先的左右两侧,第二种情况是都在树的左侧,第三种情况是都在树的右侧,如果是第二,第三种情况的话,公共祖先就在给定的两个点中比较上面的那一个。

如果转换成代码的话,从上往下走,base case分为3种,判断遇到了p就直接返回p,遇到q就直接返回q,不用向下做了。如果left,right都不为空,就返回root自己;left,right哪一个不为空就返回哪个,整个recursion做完就可以得到LCA。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null) return null;
        if(root==p) return p;
        if(root==q) return q;
        
        TreeNode left = lowestCommonAncestor(root.left,p,q);
        TreeNode right = lowestCommonAncestor(root.right,p,q);
        
        if(left!=null && right!=null) return root;
        return left!=null ? left:right;
    }
}

237. Delete Node in a Linked List

这道题出的比较古怪,只给出了要删除的节点,而没有给到我们头节点,所以我们只能采取替换节点值的方法了。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public void deleteNode(ListNode node) {
        ListNode p = node;
        while(p.next.next!=null){
            p.val = p.next.val;
            p = p.next;
        }
        p.val = p.next.val;
        p.next = null;
    }
}

238. Product of Array Except Self

两次循环,第一次循环,我们有一个标记记录的是当前位次之前数的乘积,
第二次循环,我们有一个标记记录的是当前位次之后的数的乘积,两个标记相乘,就能得到最终想要的结果。

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int[] res = new int[nums.length];
        int left = 1;
        for(int i=0;i<nums.length;i++){
            res[i] = left;
            left *= nums[I];
        }
        int right=1;
        for(int i=nums.length-1; i>=0;--i){
            res[i]*=right;
            right*=nums[I];
        }
        return res;
        
    }
}

240. Search a 2D Matrix II

我们从左下角开始搜索,如果数大于目标,那么目标可能出现的区域就是上方的行,否则,可能出现的区域是右方的列。

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int i=matrix.length-1;
        int j=0;
        while(i >= 0 && j < matrix[0].length) {
            if(matrix[i][j] == target) return true;
            else if(matrix[i][j] > target) i--;
            else j++;
        }
        return false;
    }
}

相关文章

  • Leetcode-Java(二十四)

    231. Power of Two 232. Implement Queue using Stacks 题目中要求...

  • leetcode 100

    github个人所有的leetcode题解,都在我的 leetcode-java,欢迎star和共同探讨。leet...

  • Leetcode-Java(三十)

    299. Bulls and Cows 一开始我用的是HashSet保存两个字符串中出现过的数字但是没有匹配上的,...

  • Leetcode-Java(十四)

    131. Palindrome Partitioning 回溯法 132. Palindrome Partitio...

  • Leetcode-Java(三十一)

    303. Range Sum Query - Immutable 用一个数组保存从0到当前位置的和。 304. R...

  • Leetcode-Java(二十二)

    211. Add and Search Word - Data structure design 建立一棵字典树,...

  • Leetcode-Java(二十三)

    221. Maximal Square 动态规划,只用一个一维数组,这里要注意代码里的对应关系,相当于在原数组的基...

  • Leetcode-Java(二十五)

    241. Different Ways to Add Parentheses 采用分治算法,分治算法的基本思想是将...

  • Leetcode-Java(二十六)

    257. Binary Tree Paths 类似于分治法吧。 258. Add Digits 小trick 26...

  • Leetcode-Java(二十七)

    263. Ugly Number 264. Ugly Number II 分析:这道题最直观地想法是暴力查找,但不...

网友评论

      本文标题:Leetcode-Java(二十四)

      本文链接:https://www.haomeiwen.com/subject/ueaheftx.html