废话不多说,直接开始
1.如何找到数组中出现次数超过一半的数
第一种方法是可以定义一个计数数组,遍历一次数组就能得到数组中出现元素的次数,然后在计数数组中找到次数大于N/2的元素。
第二种方法使用快速排序,因为出现次数超过一半的元素肯定就在中位数上,这个中位数可不是数学里面的中位数,奇数个元素的是中间位置的数,偶数个元素的时候,就是N/2个位置或者N/2+1位置上的数,因为两个数字是相等的,其实说白了也是数学上的中位数。这样这个问题的解点就在寻找中位数上,使用快速排序可以很快的找到在中间位置上的数字,甚至都不用排完序,就能找到。
2.寻找一堆数中的最小的K个数
第一种方法 排序,时间复杂度最好的就是快速排序 时间复杂度是 Nlog2N,排完序之后找前K个数。
第二种方法 也是排序 不过是冒泡排序,用冒泡排序走K次,小的往后移动,只需要遍历K次就可以找到 最小的K个数,当然也可以找最大的K个数。
第三种方法 建堆,建立一个个数是K的最小堆,然后遍历一边数组维护这个最小堆就可以,数组遍历完成,最小的K个数全在堆里面,
第四种方法 快速排序 先找一个基数,大的往后小的往前,看看 基数的位置和K作比较,然后得出 前K个数在哪个范围,包括基数 还是 不包括,然后 在范围内 继续二分快排,直到找到下标是K的基数 那么前K个就是 你要找的数字了。
3. 判断二进制数除以三的余数
第一种方法你可以先将二进制转换成十进制,你要是能换成三进制,那也可以算你厉害,转换成十进制之后将所有位数上的数字加起来取余三就能得到余数是多少。
第二种方法 比较神奇 学过高数的朋友们肯定知道 2的x次方是可以展开的可以展开成(3-1)的x次方,然后和三相关的肯定能被三整除,唯一一个和三不相关的就是-1了最后 取余三就是 (-1)的x次方。x为奇数的时候结果为-1.偶数的时候结果为1,这样我们只需要统计二进制数上的奇偶为上的1的个数,就能得到余数是多少了。
4.浮点数集合 找两个数做乘积 求最大值
方案1全部两两乘积,遍历寻找最大值 时间复杂度是N方
方案2将正数和负数分开 寻找正数的前二 和负数的最小2个 (快速排序解决)分别做乘积,然后比较大小就找出最大值。
5.有5亿成交数据 求销售量最高的100条
建立一个数据量大小为100个最小堆,然后维护这个小堆(顶点数是最小的),比顶点大的添加数组里删除掉比其小的数,比顶点小的跳过,添加删除,遍历整个数组,堆中的数就是前100大的数
6无序数组中 找中位数 并给出算法的时间复杂度
方案1 进行快速排序 再寻找下标为N/2的数字,时间复杂度是Nlog2N,
方案2 建堆,前(n+1)/2个元素建最小堆,维护这个最小堆,最后堆定就是你要找的中位数 时间复杂度是Nlog2N