zoukankan      html  css  js  c++  java
  • 2017-3-10 leetcode 229 238 268

    今天登陆leetcode突然发现531被锁了,有种占了便宜的感觉哈哈哈!

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

    leetcode229 Majority Element II

    leetcode238 Product of Array Except Self

    leetcode268 Missing Number

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

    229讲的是
    给你n个数字,找出所有出现次数超过n/3的数字,要求O(n)time O(1)space
    这道题简化版是 leetcode169 解法见2017-3-6

    我的思路
    类似169,只不过这次因为总数大于[n/3],要维护两个候选数字(最多有两个元素符合要求),每次有新的数字出现的时候,两个计数器都要减。扫一遍得到两个候选数字后,再扫一遍确认数目是否符合要求。

     1 class Solution {
     2 public:
     3     vector<int> majorityElement(vector<int>& nums) {
     4         int n=nums.size();
     5         int num1=-1,num2=-1,cnt1=0,cnt2=0;
     6         for(int i=0;i<n;i++){
     7             if(num1==nums[i]){
     8                 cnt1++;
     9             }else if(num2==nums[i]){
    10                 cnt2++;
    11             }else if(!cnt1){
    12                 cnt1++;num1=nums[i];
    13             }else if(!cnt2){
    14                 cnt2++;num2=nums[i];
    15             }else{
    16                 cnt1--;cnt2--;
    17             }
    18         }
    19         cnt1=cnt2=0;
    20         for(int i=0;i<n;i++){
    21             if(nums[i]==num1)cnt1++;
    22             if(nums[i]==num2)cnt2++;
    23         }
    24         vector<int> aim;
    25         if(cnt1>n/3)aim.push_back(num1);
    26         if(cnt2>n/3)aim.push_back(num2);
    27         return aim;
    28     }
    29 };
    229

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

    238讲的是
    给你一个n个数的数组nums[i],输出一个n个数的数组output[i]=nums的累乘/nums[i]。要求不能使用除法,O(n)time

    我的思路
    求个前缀乘,求个后缀乘,然后乘在一起?????

     1 class Solution {
     2 public:
     3     vector<int> productExceptSelf(vector<int>& nums) {
     4         int n=nums.size();
     5         vector<int> pre_pro(n,1),suf_pro(n,1),output(n);
     6         for(int i=n-2;i>-1;i--){
     7             suf_pro[i]=suf_pro[i+1]*nums[i+1];
     8         }
     9         output[0]=suf_pro[0];
    10         for(int i=1;i<n;i++){
    11             pre_pro[i]=pre_pro[i-1]*nums[i-1];
    12             output[i]=suf_pro[i]*pre_pro[i];
    13         }
    14         return output;
    15     }
    16 };
    prefix*suffix

    击败了7%的用户,恩,意料之中
    看一下别人写的
    思维被局限了,如果只要求前缀和,我们可以O(1)space来解决,现在多了后缀,也可以,只需要顺序扫的同时把逆序的也处理一下。

     1 class Solution {
     2 public:
     3     vector<int> productExceptSelf(vector<int>& nums) {
     4         int n=nums.size();
     5         int pre_pro=1,suf_pro=1;
     6         vector<int> output(n,1);
     7         for(int i=0;i<n;i++){
     8             output[i]*=pre_pro;
     9             pre_pro*=nums[i];
    10             output[n-1-i]*=suf_pro;
    11             suf_pro*=nums[n-1-i];
    12         }
    13         return output;
    14     }
    15 };
    O(1)space

    击败了26%。。。哪里有问题呢。。。。我看了其他的代码,貌似思路都一样,可能是评测机抽风吧

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

    268讲的是
    给你n个不同的数字,a[i]属于[0,n],问你缺少了哪个数字

    思路
    水题。。。n*(n+1)/2减去累加和

     1 class Solution {
     2 public:
     3     int missingNumber(vector<int>& nums) {
     4         int n=nums.size(),tot=0;
     5         for(int i=0;i<n;i++){
     6             tot+=nums[i];
     7         }
     8         return n*(n+1)/2-tot;
     9     }
    10 };
    268
  • 相关阅读:
    CF763C Timofey and Remoduling
    CF762E Radio Stations
    CF762D Maximum Path
    CF763B Timofey and Rectangles
    URAL1696 Salary for Robots
    uva10884 Persephone
    LA4273 Post Offices
    SCU3037 Painting the Balls
    poj3375 Network Connection
    Golang zip压缩文件读写操作
  • 原文地址:https://www.cnblogs.com/xuwangzihao/p/6531477.html
Copyright © 2011-2022 走看看