Leetcode解题思路总结(Medium)

338. Counting Bits

思路:计算一个10进制数的2进制表示中含有多少个1,有2种方法,一种是bit manipulation,另一种是简单的dynamic programming。代码见:http://www.cnblogs.com/coderworld/p/leetcode-countingbits.html

136. Single Number

思路:一个数组中,每个数字都出现了2次,只有一个数字出现了1次,要求找到那个数。我一开始想到的方法是用扫描数组添加到set中,如果出现了2次就从set中erase掉,扫面完后set中唯一一个元素就是我们需要的返回值,写完代码AC结果发现要84ms,超级慢。然后我在搜了搜,发现有种20ms就AC的方法,那就是利用异或操作^,a^a=0, a^0=a,根据交换律a^b=b^a,比如3^4^3=4,根据异或操作的这种性质,我们可以将所有元素依次做异或操作,相同元素异或为0,最终剩下的元素就为Single Number。时间复杂度O(n),空间复杂度O(1)。代码见我

347. Top K Frequent Elements

思路:找出一个数组中出现次数最多的K个数。可以考虑用priority_queue,假如元素是<int, int>这种pair形式,那么优先队列就是按着key的降序进行的,所以队首一定是key最大的元素。这样从优先队列中pop出前K个元素,就可以得到结果了。不过问题是怎样把数组中的元素加到优先队列中。所以我们需要对数组做一次预处理,即统计每个数字出现的次数。可以用map,但是我选择用unordered_map,因为unordered_map是无序的,map是有序的,所以插入元素时unordered_map会快很多。最后代码运行36ms 如果用map的话,那就是60ms了。

260. Single Number III

思路:前面做了只有一个出现一次的数,其他都是出现两次,思路和那题一样。只是这个先将所有数一起异或,然后得到的结果将是两个只出现一次数的异或。也就是说最后得到的数字是a ^ b,而我们需要的是a和b而不是a和b的异或。那如何将a和b从(a^b)中分离呢?比如a是5(101),b是3(011),那么(a^b)就是6(110),观察一下6,6的第二位为1说明a和b在第二位肯定不同,然后就可以根据与这个位的数是否为0将数组分为两半,并且a和b肯定会被分别分开到这两个数组中。这样问题就回到了上题的思路,只要让子数组内元素全部异或一下,得到的两个数就是最终要的只出现一次的数。这段话可能有点绕,需要好好琢磨琢磨一下。判断1在哪一位就用0x01循环的去做&运算就好。代码只需要16ms

238. Product of Array Except Self

思路:解法比较巧妙。由于output[i] = (x0 * x1 * ... * xi-1) * (xi+1 * .... * xn-1)。因此执行两趟循环:
第一趟正向遍历数组,计算x0 ~ xi-1的乘积
第二趟反向遍历数组,计算x

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值