LeetCode刷题日记(Day16)

Problem 136. Single Number

  • 题目描述
    Given a non-empty array of integers, every element appears twice except for one. Find that single one.

    Note:

    Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

    Example:

    Input: [2,2,1]
    Output: 1
    
  • 解题思路
    要在线性时间内求出数组中落单的数,且不能开辟过多的空间,最好的办法就是使用“异或”运算。对两个相同的数求异或之后,得到的结果为0,所以在对所有数进行异或操作之后,得到的结果就是落单的那个数了。

  • 代码实现

class Solution {
public:
    int singleNumber(vector& nums) {
        for(int i = 1; i < nums.size(); ++i)
            nums[0] ^= nums[i];
        return nums[0];
    }
};


Problem 155. Min Stack

  • 题目描述
    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

    push(x) – Push element x onto stack.
    pop() – Removes the element on top of the stack.
    top() – Get the top element.
    getMin() – Retrieve the minimum element in the stack.

    Example:

    MinStack minStack = new MinStack();
    minStack.push(-2);
    minStack.push(0);
    minStack.push(-3);
    minStack.getMin();   --> Returns -3.
    minStack.pop();
    minStack.top();      --> Returns 0.
    minStack.getMin();   --> Returns -2.
    
  • 解题思路
    定义两个 stack< int> 变量 dataStack 和 minStack,其中 dataStack 用来管理 MinStack 对象的数据操作如 push 和 pop,minStack 用来存储 push 进来的最小值。在求最小值时,只需返回 minStack.pop() 即可。

  • 代码实现

class MinStack {
    public:
        MinStack() {}
        
        void push(int x) {
            dataStack.push(x);
            if(minStack.empty())
                minStack.push(x);
            else{
                int min = minStack.top();
                if(min >= x)
                    minStack.push(x);
            }
        }
        
        void pop() {
            int n = dataStack.top();
            int min = minStack.top();
            dataStack.pop();
            if(n == min)
                minStack.pop();
        }
        
        int top() {
            return dataStack.top();
        }
        
        int getMin() {
            return minStack.top();
        }
    private:
        stack dataStack;
        stack minStack;
};


Problem 160. Intersection of Two Linked Lists

  • 题目描述
    Write a program to find the node at which the intersection of two singly linked lists begins.

  • 解题思路
    若要求链表headA和headB的公共开始节点,假设此节点为res,则从res节点开始两个链表往下的长度是一致的。解题思路如下:

  1. 分别求出headA和headB的长度len1和len2,以及len1和len2的差值k,令较长的链表向前移动k步,则此时两个链表往下的长度相等。
  2. 对headA和headB所指的内存空间进行判断,如果相等则此节点为公共开始节点,否则继续向下找。
  • 代码实现
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int len1 = length(headA);
        int len2 = length(headB);
        if(len1 < len2)
            for(int i = 0; i < len2-len1; ++i)
                headB = headB->next;
        else
            for(int i = 0; i < len1-len2; ++i)
                headA = headA->next;
        ListNode * res = NULL;
        while(headA && headB){
            if(headA == headB){
                res = headA;
                break;
            }
            headA = headA -> next;
            headB = headB -> next;
        }
        return res;
    }
    int length(ListNode * node){
        if(node == NULL)
            return 0;
        int count = 1;
        while(node->next != NULL){
            count ++;
            node = node->next;
        }
        return count;
    }
};

Problem 169. Majority Element

  • 题目描述
    Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

    You may assume that the array is non-empty and the majority element always exist in the array.

    Example:

    Input: [3,2,3]
    Output: 3
    
  • 解题思路
    要求出给定数组nums中出现次数超过一半的元素,若规定了时间复杂度为 O(N),空间复杂度为 O(1),则可以采用“多数投票算法”。
    该算法的原理如下:

  1. 先假设数组的首元素 candidate 为获票最多的人,它所拥有的票数 cnt 为1;

  2. 对后续元素进行遍历,如果 nums[i] == candidate,则 cnt++(意味着后面又有人给 candidate 投票),否则 cnt–(抵消了 candidate 的一票)。

  3. 判断 cnt 的大小,如果为 0 表示当前 candidate 的票数被抵消了,此时选取下一个 nums[i] 为新的 candidate,并重复此过程。

    该算法的巧妙性在于,如果存在某一个 candidate 获得了超过半数的投票,那么无论有多少反对票,都无法将它的 cnt 抵消为 0,该 candidate 总能够胜出。所以,对于数组 nums,只要返回最后的 candidate 的值即可。

  • 代码实现
class Solution {
public:
    int majorityElement(vector& nums) {
        int candidate = nums[0];
        int cnt = 1;
        for(int i = 1; i < nums.size(); ++i){
            if(cnt == 0){
                candidate = nums[i];
                cnt = 1;
            }
            else{
                if(nums[i] == candidate)
                    cnt++;
                else
                    cnt--;
            }
        }
        return candidate;
    }
};

Problem 171. Excel Sheet Column Number

  • 题目描述
    Given a column title as appear in an Excel sheet, return its corresponding column number.

    For example:

        A -> 1
        B -> 2
        C -> 3
        ...
        Z -> 26
        AA -> 27
        AB -> 28 
        ...
    
  • 解题思路
    本题相当于将一个26进制数(字母表有26个字母),转化为十进制数。原理较简单,代码如下:

  • 代码实现

class Solution {
public:
    int titleToNumber(string s) {
        int len = s.length();
        int res = 0;
        if(len == 0)
            return res;
        for(int i = 0; i < len; ++i){
            res = res * 26 + (s[i]-'A' + 1);
        }
        return res;
    }
};

你可能感兴趣的:(LeetCode刷题日记(Day16))