Leetcode之PHP版题目解析(136. Single Number)
2019-3-11 星期一 开始吧
题目描述
给一个不为空的数组,除了一个元素外,每一个元素都会出现两次,找出那个出现一次的数.
题目示例
例1输入[2,2,1],那么返回的就是出现一次的1,例2输入的是[4,1,2,1,2],那么输出的就是出现一次的4.
题目思路
我的思路(好吧我第一次使用的是暴力破解法,这是一种超级常规的思想,看看就好,他的运行效率会很低,不推荐这种,既然我们刷题了,当然要用更优的解法做题)
/** * @param Integer[] $nums * @return Integer */ function singleNumber($nums) { $data=[]; foreach($nums as $num) { if(!in_array($num,$data)) { array_push($data,$num); }else{ $index=array_search($num,$data); array_splice($data,$index,1); } } return $data[0]; }
这代码你们一看就明白了,主要是分析一下他的时间复杂度.很明显我们搜索了整个数组,并且查找值是否存在定义的数组中,这个查找的过程是在for循环中进行的,所以他的时间复杂度O(n*n),空间复杂度就是O(n).运行结果惨不忍睹.
我们可以通过运算符异或(^)来进行比较,当^左边等于右边时,结果为默认值0,当^的左边不等于右边时,结果返回默认值1.所以我们可以将所有的位异或找出唯一的值.
实现代码
/** * @param Integer[] $nums * @return Integer */ function singleNumber($nums) { $res=0; for($i=0;$i<count($nums);$i++) { $res ^=$nums[$i]; } return $res; }
时间复杂度,我们只是循环了数组,所以时间复杂度是O(n),空间复杂度常量O(1).
3條評論
图片看不到。。。
我上传成功的时候都没看到有这茬。。。
另外 我新增了一个「算法系列」类目 以后可以发布到这个类目下