一、笔记部分
这种含有出现关键字,而且还有有序的时候,一般不会用哈希表,一般是无序统计出现次数才会用哈希表。
直接用HashMap 取搞就没有意思了,那么有序就根本没有用用到了。
中间的数要么和左边相等,要么和右边相等。看左右边元素没有什么用,因为你进行了第一次比较后不知道往那边走了,看元素是否等于中间元素,里面的if条件无法写,因为根本单个元素到底在那边数组我们是不知道。
因为用二分法一定要知道找到中间元素元素后,通过if判断我们要知道我们到底下一步走那一边,不知道的话,还不如直接遍历。二分法只要是通过判断中间元素从而知道我们走那边。
我上面的想法能找出一对来,已经走了一大步了。取出一对后,剩下两个数组包含的数量肯定一个为奇数、一个为偶数,这样就会找的出来了,尽量不要用旁边的两个元素和中间元素比较,因为数组比较越多越容易越界。
正确思路:
1.把握好只有一个奇数,其他都是成对,那么数组肯定是奇数,但是数组是从0开始,所以首位和末尾都是偶数,取中间值的时候有偶数有奇数,偶数下标就是成对的第一位是数,所以如果中间索引是奇数那么就要-1,变成偶数判断与后一个数是否相等。
2.如果相等,说明单位数在后面,如果不相等,说明单位数在前面闭区间(因为可能就是这个单位数)
所以二分查找这些区间的l、r是非常灵活的,根据你自己的要求选择
为什么最后重合了是单个元素?
因为每次确定了中间元素,然后选择数组,都是选择的是奇数数组,所以最后肯定只剩下一个元素。最后一个分组肯是三个。
二、二分法类型的高频面试题汇总:
https://blog.csdn.net/qq_40262372/article/details/112572853
三、各种类型的高频面试题汇总:
https://blog.csdn.net/qq_40262372/article/details/112556249