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值作为守阵地的士兵,继续下去,到最后还留在阵地上的士兵,有可能是主元素。
再加一次循环,记录这个士兵的个数看是否大于数组一般即可。
第一个数字作为第一个士兵,守阵地;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; }