2017-3-6 leetcode 118 169 189
Posted 徐王
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 };
==============================================
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 };
天,这题神他妈真的有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 }
厉害厉害。。。。
好吧,这不是分析的结果,这道题有专门的算法,叫 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 };
好吧这是一道思路题,考查的是逻辑思维,不是代码能力。。。。我看到了几种都挺不错的解法
第一种就是重新开个数组,直接暴力O(n)扫着移过去
。
。后面的解法比较巧妙
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
2,reverse前(n-k)个和后k个,然后再整体reverse
3,交换前k个和后k个,这样,前k个位置定下来了,对于后n-k个我们用同样的操作循环来弄
厉害了。。。
以上是关于2017-3-6 leetcode 118 169 189的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode 169. Majority Element