2021.5.19leetcode总结

1、二进制中1的个数(汉明重量)
与主站的一道题一致,只需要设置一个count用于统计消除数字1的次数即可。当n这个二进制数不为0时,对count进行+1操作,然后再利用n&(n-1)消除整个二进制数最右边的1。

2、数组中出现数字超过一半的数字
两种解法:一种是利用哈希表,一种是利用众数的数学性质
首先说哈希表,创建一个unordered_map mp;创建一个哈希表用于存储键值对,从原数组中取出相应的键,然后对相应的值进行+1。循环取值完成后,循环判断哈希表中的值,如果大于原数组大小的一半,则输出哈希表的键。从哈希表中取值可以使用for(auto& e : mp),然后可以使用e.first取得键,使用e.second取得值。
(在这里出现了使用auto& 循环取值,那么auto&循环取值和for循环取值应该在什么样的条件下使用什么样的方式呢?答案是当只需要从容器中取得值,而不需要知道值的位置的时候,就可以使用auto& 来取值)

第二种解法时利用众数的数学性质,我们知道,如果数组中出现数字超过一半的数字,那么这个数字有且只能有一个,而且题目指明了众数一定存在,那么我们将原数组排序后中间索引位置的数字一定是该众数。所以可以采取将原数组排序后,返回数组中间的值来解决。

3、旋转数组的最小数字
后来才发现,原来这个题目考察的是二分查找…
两种解法(其实是三种,但是那种排序后输出第一位的方法还是不要用了…)
首先是第一种,暴力解法,对原数组进行遍历后输出最小值,也就是说首先设定一个不可能的最小值,然后对数组进行遍历,每遍历一次更新最小值,最后得到的一定是最小值。

第二种解法:二分查找(这才是这个题目想要考察的点)(题目的目的是想告诉我们,二分查找不仅能够用于递增递减区间,对于某点左边和右边具有同样性质的的区间也可以使用,例如寻找一点,该点左边的元素都大于等于数组尾部元素,该点右边的元素都小于等于数组尾部的元素)。
首先判断极端情况,数组的最后几位相同,则取相同数字的最前面的一位为r。然后进行二分查找,二分查找的mid最好写成mid = (left + right ) >> 1;如果中间的数字小于末尾的数字,则说明旋转点在中间数字的左边,我们需要在左半区间继续进行查找。两区间为(l, mid)(mid +1, r)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值