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个我们用同样的操作循环来弄

厉害了。。。

posted @ 2017-03-06 20:14  徐王  阅读(123)  评论(0编辑  收藏  举报