LeetCode经典题目笔记(二)

关于算法与数据结构的相关博文:

二叉树相关练习题(C++)
经典排序算法的C++实现
与字符串有关的一些典型问题的C++解法
一些可以用动态规划(DP)算法解决的问题(C++)
排列组合相关笔试面试题(C++)
与概率相关的算法题C++解法(附证明过程)
二分查找的巧妙运用(C++)
位运算在算法题中的使用(C++)
链表相关练习题(C++)
用实例讲解栈和队列(C++)
一些智力题的C++解法
KMP算法相关学习资料
LeetCode经典题目笔记(一)

九、判断链表是否是回文链表
解法:O(N)\O(N)的解法。
class  Solution { 
public
    ListNode* temp;
    bool  isPalindrome(ListNode* head) { 
        temp = head; 
         return  check(head); 
    } 
    bool  check(ListNode* p) { 
        if ( NULL == p)  return  true ;
        bool  isPal = check(p->next) & (temp->val == p->val);
       temp = temp->next;
        return  isPal;
    } 
};

十、找出无序数组中出现次数大于n/2的数
解法一、用库函数   nth_element(nums.begin(), nums.begin() + nums.size() / 2 , nums.end());
class  Solution {
public :
    int  majorityElement( vector< int > & nums) {
        nth_element(nums.begin(), nums.begin() + nums.size() /  2 , nums.end());
         return  nums[nums.size() /  2 ];
    } 
};
解法二、随机枚举(居然是最快的-_-
class  Solution {
public :
     int  majorityElement( vector< int > & nums) {
         int  n = nums.size();
        srand( unsigned (time( NULL )));
         while  ( true ) {
             int  idx = rand() % n;
             int  candidate = nums[idx];
             int  counts =  0
             for  ( int  i =  0 ; i < n; i++)
                if  (nums[i] == candidate)  counts++; 
             if  (counts > n /  2
                return  candidate;
        }
    }
};
解法三、
class  Solution { 
public
    int  majorityElement( vector< int > & nums) { 
        int  major, counts =  0 , n = nums.size(); 
         for  ( int i = 0 ; i < n; i++) { 
            if  (!counts) { 
                 major = nums[i]; counts =  1
            } 
            else   counts += (nums[i] == major) ? 1 : - 1
        } 
        return  major;
 } 
};

十一、删除排序数组中重复的元素
解法:遍历一遍,记录下已遍历的元素中重复的个数,把元素向前移动重复个数位置就行了。
class  Solution {
public :
     int  removeDuplicates(vector< int >& nums) {
         int  count =  0 ;
         for  ( int  i =  1 ; i < nums.size(); i++){
             if  (nums[i] == nums[i- 1 ]) count++;
             else  nums[i-count] = nums[i];
        }
         return  nums.size()-count;
    }
};

十二、一个字符串只含大小写字符和空格,返回字符串中最后一个单词的长度
解法:遍历一遍,统计每个单词的长度,若遇到空格则把前一个单词的长度置0.
class  Solution {
public :
     int  lengthOfLastWord(string s) {
         int  len =  0 ;
         for  ( int  i =  0 ;i < s.size();) {
             if  (s[i++] != ' ') len++;
             else if  (s[i] != '\ 0 '&&s[i] != ' ') len =  0 ;
        }
         return  len;
    }
};

十三、二叉树的镜像
解法一:递归。
class  Solution {
public :
    TreeNode* invertTree(TreeNode* root) {
         if  (!root)
             return  root;
        swap(root->left,root->right);
        invertTree(root->left);
        invertTree(root->right);
         return  root;
    }
};
解法二:非递归。
class  Solution {
public :
    TreeNode* invertTree(TreeNode* root) {
        stack s;
        s.push(root);
         while  (!s.empty()) {
            TreeNode* temp = s.top();
            s.pop();
             if  (temp) {      
            swap(temp->left,temp->right);
                s.push(temp->right);
                s.push(temp->left);
            }
        }
         return  root;
    }
};

十四、Happy数的判断

解法:利用链表判环方法,快慢”指针“。Happy数最终会以1结束,非Happy数会无限循环,所以只需要判断是否出现环即可。
class  Solution {
public :
     int  digitSquareSum( int  n) {
         int  sum =  0 , tmp;
         while  (n) {
            tmp = n %  10 ;
            sum += tmp * tmp;
            n /=  10 ;
        }
         return  sum;
    }
     bool  isHappy( int  n) {
         int  slow, fast;
        slow = fast = n;
         do  {
            slow = digitSquareSum(slow);
            fast = digitSquareSum(fast);
            fast = digitSquareSum(fast);
             if  (fast ==  1 return  1 ;
        } while  (slow != fast);
         return  0 ;
}
};

你可能感兴趣的:(数据结构与基本算法)