zoukankan      html  css  js  c++  java
  • 数组中长度超过一半的数字

    1.思路一  

    一开始 老不对老不对,我以为是 把vevtor 换成数组就对了  我以为是这个问题呢   其实不是  

    原因竟然是  end=index-1;    这里要拿出来才行 不然就是不对 注意吧 

    class Solution {
    public:
        int MoreThanHalfNum_Solution(vector<int> numbers) {
         if(numbers.empty())
          return 0;
         //最后那个字 一定是在排序的中间位置  //超过数组长度一般嘛
          //不用完全排序  找到k位置 前面都比他小  后面都比他大即可
          int length =numbers.size();
          int middle= length/2;
          int start=0;int end=length-1; 
          int index=partition(numbers,start,end);  
            while(index!=middle)
            {
               if (index>middle)
               {
               end=index-1;   
               index= partition(numbers,start,end); 
                }else
               {
                start=index+1;
                index= partition(numbers,start,end); 
                }
            }
            int result=numbers[middle];
            //接下来要判断是否 这个数字没有满足大于数组一半的要求
            int num=0;
            for(int i=0;i<length;i++)
            {
               if(numbers[i]==result) 
                   num++;
            }
            if(num>length/2)
             return result;
           else
             return 0;
            
        }
        public:
        int  partition(vector<int>  & numbers,int low,int high)
        {
            int pivotkey=numbers[low];//当参考值
            
            while(low<high)
            {
                while(low<high&&numbers[high]>pivotkey)
                {high--;}  
                swap(numbers[low],numbers[high]);
                
               while(low<high&&numbers[low]<=pivotkey)
                   { low++;}
                swap(numbers[low],numbers[high]); 
                
            }
            
            return low;
            
        }
         public:  
        void swap(int &A,int &B)
        {
          int temp;
          temp=A;
          A=B;
          B=temp;
         }
    };

    2.思路2

    思路二:如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。
    在遍历数组时保存两个值:一是数组中一个数字,一是次数。遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。遍历结束后,所保存的数字即为所求。然后再判断它是否符合条件即可。
     
    通俗易懂的说法:
    采用阵地攻守的思想:
    第一个数字作为第一个士兵,守阵地;count = 1;
    遇到相同元素,count++;
    遇到不相同元素,即为敌人,同归于尽,count--;当遇到count为0的情况,又以新的i值作为守阵地的士兵,继续下去,到最后还留在阵地上的士兵,有可能是主元素。
    再加一次循环,记录这个士兵的个数看是否大于数组一般即可。
     
    // ====================方法2====================
    //这个比较复杂,就是下一值如果和当前值一致,count就+1,否则-1,如果为0,则舍弃记录当前值,改下一值,最后+1的值可能会超过一半
    int MoreThanHalfNum_Solution2(int* numbers, int length)
    {
        if (CheckInvalidArray(numbers, length))
            return 0;
    
        int result = numbers[0];//初试为第一个值
        int times = 1;//初试为1
        for (int i = 1; i < length; ++i)
        {
            if (times == 0)//改记录下一值
            {
                result = numbers[i];
                times = 1;
            }
            else if (numbers[i] == result)
                times++;
            else
                times--;
        }
    
        if (!CheckMoreThanHalf(numbers, length, result))
            result = 0;
    
        return result;
    }
  • 相关阅读:
    es6新增特性,数组的操作方法
    导航钩子有哪几种,如何将数据传入下一个点击的路由页面
    父组件如何获取子组件数据,子组件如何获取父组件数据,父子组件如何传值
    watch和computed的区别
    vue页面中定时器的使用
    table表格,顶端对齐
    计算机组成原理8-FPGA、ASIC、TPU、虚拟机
    vue中使用socket连接后台
    计算机组成原理7-CISC和RISC、GPU
    计算机组成原理6-流水线、多发射和超标量、SIMD、异常
  • 原文地址:https://www.cnblogs.com/cgy1012/p/11399276.html
Copyright © 2011-2022 走看看