• 2017-3-6 leetcode 118 169 189


    今天什么都没发生

    =================================================

    leetcode118 https://leetcode.com/problems/pascals-triangle/?tab=Description

    leetcode169 https://leetcode.com/problems/majority-element/?tab=Description

    leetcode189 https://leetcode.com/problems/rotate-array/?tab=Description

    ===================================================

    118说的是
    给你n,输出n行的杨辉三角

    比如输入5,输出下面这个

    [
         [1],
        [1,1],
       [1,2,1],
      [1,3,3,1],
     [1,4,6,4,1]
    ]

    我的思路
    没什么思路,模拟题,看代码

     1 class Solution {
     2 public:
     3     vector<vector<int> > generate(int numRows) {
     4         int &n=numRows;
     5         vector<vector<int> > aim(n);
     6         if(n==0)return aim;
     7         aim[0].push_back(1);
     8         for(int i=1;i<n;i++){
     9             aim[i].push_back(1);
    10             for(int j=1;j<i;j++){
    11                 aim[i].push_back(aim[i-1][j]+aim[i-1][j-1]);
    12             }
    13             aim[i].push_back(1);
    14         }
    15         return aim;
    16     }
    17 };
    118

    ==============================================

    169说的是
    求众数,所谓众数,是有一个数字,他出现在n个数中超过2/n次,题目保证n>0且这个数字一定存在

    我的思路
    讲道理我没什么好的思路,那就nlogn排个序,然后线性的扫一遍吧。。。。

     1 class Solution {
     2 public:
     3     int majorityElement(vector<int>& nums) {
     4         int n=nums.size();
     5         vector<int> mynums(nums);
     6         sort(mynums.begin(),mynums.end(),less<int>());
     7         int cnt=1;
     8         for(int i=1;i<n;i++){
     9             if(mynums[i]!=mynums[i-1]){
    10                 if(cnt>(n/2))
    11                     return mynums[i-1];
    12                 cnt=1;
    13             }else cnt++;
    14         }
    15         return mynums[n-1];
    16     }
    17 };
    169 nlogn

    天,这题神他妈真的有O(n)的算法。。。。秘诀在于该题特殊的“众数定义”,不仅仅是最多的,而且他的“数量超过一半”。。。。代码如下

     1 public class Solution {
     2     public int majorityElement(int[] num) {
     3 
     4         int major=num[0], count = 1;
     5         for(int i=1; i<num.length;i++){
     6             if(count==0){
     7                 count++;
     8                 major=num[i];
     9             }else if(major==num[i]){
    10                 count++;
    11             }else count--;
    12             
    13         }
    14         return major;
    15     }
    16 }
    O(n)

    厉害厉害。。。。

    好吧,这不是分析的结果,这道题有专门的算法,叫  Boyer-Moore Majority Vote algorithm 学习了。。。

    =================================================

    189说的是
    给你n个数字,向循环右移k次,输出操作后的数组。(要求使用三种以上的方法)
    For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

    我的思路
    额。。。。一开始就会想不用多余的空间,就是从一个点开始循环交换,这算是一道思路题吧。。。直接给个我认为比较优的解好了。。。

     1 class Solution {
     2 public:
     3     void rotate(vector<int>& nums, int k) {
     4         int n=nums.size();
     5         if(!n)return;
     6         k=k%n;
     7         int temp=__gcd(n,k);
     8         for(int i=0;i<temp;i++){
     9             int ptr=i+k;
    10             while(ptr!=i){
    11                 nums[i]^=nums[ptr];
    12                 nums[ptr]^=nums[i];
    13                 nums[i]^=nums[ptr];
    14                 ptr=ptr+k;
    15                 ptr-=ptr>=n?n:0;
    16             }
    17         }
    18     }
    19 };
    189

    好吧这是一道思路题,考查的是逻辑思维,不是代码能力。。。。我看到了几种都挺不错的解法
    第一种就是重新开个数组,直接暴力O(n)扫着移过去

    。后面的解法比较巧妙

    2,reverse前(n-k)个和后k个,然后再整体reverse

    3,交换前k个和后k个,这样,前k个位置定下来了,对于后n-k个我们用同样的操作循环来弄

    厉害了。。。

  • 相关阅读:
    Mysql优化
    RabbitMQ教程
    手把手Centos7 安装jenkins详细教程
    FreeMarker学习系列之一
    Vue学习之Vue模拟后台数据
    vuejs学习之新的components组件挂载
    vuejs学习之项目结构解读
    VueJS学习之Vue-cli项目模板
    菜鸟手把手学Shiro之shiro授权流程
    js基石之---es7的decorator修饰器
  • 原文地址:https://www.cnblogs.com/xuwangzihao/p/6511699.html
Copyright © 2020-2023  润新知