特殊情况:数组{1, 0 , 1 , 1 , 1}和数组{1, 1 , 1 , 0 , 1}都可以看成是递增排序数组{0, 1 , 1 , 1 , 1}的旋转。 在这两种情况下,第一个指针和第二个指针的数字都是1,并且两个指针中间的数字也是1,我们无法判断中间的数字是位于前面的子数组中还是位于后面的子数组中,也无法移动两个指针来缩小查找的范围。因此不得不选择顺序查找的方法。 4.5. 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入了一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过了数组长度的一半,因此输出2. 最简单的方法是给数组进行排序,然后遍历统计每个数字出现的次数。但是排序的时间复杂度是O(nlogn). 能否找出一个复杂度是O(n)的方法? 方法一: 数组中有一个数字出现的次数超过数组的一半,如果把这个数组排序,那么排序后位于数组中间的数字一定就是那个出现次数超过一半的数字。也就是,这个数字就是统计学中的中位数。 这种算法是受快速排序算法启发。在随机快速排序算法中,我们先在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的在左边,大的在右边。如果选中的数字下标刚好是n/2,则这个数字就是数组的中位数。 如果它的下标大于n/2,那么中位数应该在它左边,那么接着在他的左边
原创力文档

文档评论(0)