星期六, 三月 05, 2016

13. Roman to Integer

Given a roman numeral, convert it to an integer.

 

Input is guaranteed to be within the range from 1 to 3999.

 

解题思路:

 

 

 

屏幕剪辑的捕获时间: 2016/3/4 22:52

从左到右,两两进行比较。。。使用map和数组标记两种方式所消耗的时间不同。。

#include<string>

#include<iostream>

#include<map>

using namespace std;

class Solution {

public:

    int romanToInt(string s) {

        int n=s.size();

        if(n==0)return 0;

        // 68ms

        //map<char,int>m;

        //m['I']=1;

        //m['X']=10;

        //m['C']=100;

        //m['M']=1000;

        //m['V']=5;

        //m['L']=50;

        //m['D']=500;

 

        // 32ms

        int m[26]={0};

        m['I'-'A']=1;

        m['X'-'A']=10;

        m['C'-'A']=100;

        m['M'-'A']=1000;

        m['V'-'A']=5;

        m['L'-'A']=50;

        m['D'-'A']=500;

        int ans=0;

        for(int i=0;i<n-1;i++){

            int a=m[s[i]-'A'];

            if(s[i]=='I'||s[i]=='X'||s[i]=='C'){

            int b=m[s[i+1]-'A'];

            if(a<b)ans-=a;

            else

                ans+=a;

            }

            else

                ans+=a;

        }

        ans+=m[s[n-1]-'A'];

        return ans;

    }

};

 

235. Lowest Common Ancestor of a Binary Search Tree

Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.

 

According to the definition of LCA on Wikipedia: "The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself)."

 

        _______6______

       /              \

    ___2__          ___8__

   /      \        /      \

   0      _4       7       9

         /  \

         3   5

For example, the lowest common ancestor (LCA) of nodes 2 and 8 is 6. Another example is LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.

 

解题思路:

因为是二叉搜索树,有左子树的所有值都小于父节点的值,右子树的所有值都大于父节点,因此递归判断两个节点在左子树还是右子树,若在两边,则父节点就是其最小公共祖先,否则递归搜索同在一遍的子树。

#include<windows.h>

using namespace std;

struct TreeNode {

    int val;

    TreeNode *left;

    TreeNode *right;

    TreeNode(int x) : val(x), left(NULL), right(NULL) {}

};

  

class Solution {

public:

// 40ms-42ms

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {

        if(root==NULL)return root;

        if(p==NULL)return q;

        if(q==NULL)return p;

        int val=root->val;

        if((val-p->val)*(val-q->val)<=0)return root;

        if(val>p->val)return lowestCommonAncestor(root->left,p,q);

        return lowestCommonAncestor(root->right,p,q);

    }

};

 

191. Number of 1 Bits

Write a function that takes an unsigned integer and returns the number of '1' bits it has (also known as the Hamming weight).

 

For example, the 32-bit integer '11' has binary representation 00000000000000000000000000001011, so the function should return 3.

 

解题思路:

1bit manipulate  利用n&(n-1)快速去掉最低位的1.

2、使用c++ stl中的bitset类型,将其转换为32位的二进制,利用count方法得到1的个数

3、已知输入为32位无符号的整数,可以知道只要循环32次,求每位是否为1.

#include<stdint.h>

#include<bitset>

using namespace std;

class Solution {

public:

    // 8ms

  //  int hammingWeight(uint32_t n) {

        //bitset<32>ans(n);

        //return ans.count();

  //  }

    // 8ms

    int hammingWeight(uint32_t n) {

        int cnt=0;

        for(;n;n>>=1){

            if(n&1)cnt++;

        }

        return cnt;

    }

    // 4ms

    int hammingWeight(uint32_t n) {

        int cnt = 0;

        for(; n; n >>= 1)

            if(n&1) ++cnt;

        return cnt;

    }

};

 

星期三, 三月 02, 2016

144. Binary Tree Preorder Traversal

Given a binary tree, return the preorder traversal of its nodes' values.

For example:

Given binary tree {1,#,2,3},

   1
    \
     2
    /
   3

return [1,2,3].

 

解题思路:

题目很简单,就是求一个二叉树的前序遍历。。使用栈实现递归过程。。。这里分别给出保存TreeNode的栈和保存TreeNode指针的栈。。

/**

 * Definition for a binary tree node.

 * struct TreeNode {

 *     int val;

 *     TreeNode *left;

 *     TreeNode *right;

 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}

 * };

 */

class Solution {

public:

    vector<int> preorderTraversal(TreeNode* root) {

        vector<int>res;

        stack<TreeNode>s;

        if(root==NULL)return res;

        s.push(*(root));

        while(!s.empty()){

            TreeNode tmp=s.top();

            s.pop();

            res.push_back(tmp.val);

            if(tmp.right!=NULL)s.push(*(tmp.right));

            if(tmp.left!=NULL)s.push(*(tmp.left));

        }

        return res;

    }

};

 

/**

 * Definition for a binary tree node.

 * struct TreeNode {

 *     int val;

 *     TreeNode *left;

 *     TreeNode *right;

 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}

 * };

 */

class Solution {

public:

    vector<int> preorderTraversal(TreeNode* root) {

        vector<int>res;

        stack<TreeNode*>s;

        if(root==NULL)return res;

        s.push(root);

        while(!s.empty()){

            TreeNode* tmp=s.top();

            s.pop();

            res.push_back(tmp->val);

            if(tmp->right!=NULL)s.push(tmp->right);

            if(tmp->left!=NULL)s.push(tmp->left);

        }

        return res;

    }

};

 

java如果使用栈或者递归方法,耗时2ms,在discuss那里看到不用stack,用rights数组保存遍历过程中遇到的右结点,当当前结点的左结点为空,则从rights数组中找到最近的右结点。。。该方法耗费空间。。

/**

 * Definition for binary tree

 * public class TreeNode {

 *     int val;

 *     TreeNode left;

 *     TreeNode right;

 *     TreeNode(int x) { val = x; }

 * }

 */

public class Solution {

   public List<Integer> preorderTraversal(TreeNode root) {

            List<Integer>order=new ArrayList<Integer>();

            List<TreeNode>rights=new ArrayList<TreeNode>();

            if(root==null)return order;

            TreeNode cur=root;

            int ind=-1;

            while(cur!=null){

                order.add(cur.val);

                if(cur.right!=null){

                    ind++;

                    rights.add(ind,cur.right);

                }

                if(cur.left!=null)cur=cur.left;

                else{

                    cur=ind<0?null:rights.get(ind);

                    ind--;

                }

                 

            }

            return order;

        }

}

 

 

206. Reverse Linked List

Reverse a singly linked list.

 

解题思路:

求一个链表的逆序。一种方法是遍历链表,将节点保存到stack中,在一个个出栈加到链表中;另一个方法是遍历链表,将每个节点插入到队首。。

 

C++ 8ms

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     ListNode *next;

 *     ListNode(int x) : val(x), next(NULL) {}

 * };

 */

class Solution {

public:

    ListNode* reverseList(ListNode* head) {

        if(head==NULL)return head;

        ListNode* root=new ListNode(0);

        ListNode* p=head;

        while(p!=NULL){

            ListNode*q=p->next;

            p->next=root->next;

            root->next=p;

            p=q;

        }

        return root->next;

    }

};

 

Java 0ms

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode(int x) { val = x; }

 * }

 */

public class Solution {

   public ListNode reverseList(ListNode head) {

        if(head==null)return head;

        ListNode p=head;

        ListNode root=new ListNode(0);

        while(p!=null){

            ListNode q=p.next;

            p.next=root.next;

            root.next=p;

            p=q;

        }

        return root.next;

    }

}

 

3ms

public class Solution {

   public ListNode reverseList(ListNode head) {

        if(head==null)return head;

        Stack<Integer>stack=new Stack<Integer>();

        ListNode p=head;

        while(p!=null){

            stack.push(p.val);

            p=p.next;

        }

        p=head;

        while(p!=null){

            p.val=stack.pop();

            p=p.next;

        }

        return head;

    }

}