136. Single Number

本文探讨了在整数数组中查找唯一出现一次元素的有效算法。介绍了三种解决方案,包括使用额外列表、哈希映射及异或操作。重点分析了异或算法,其凭借线性时间复杂度和不使用额外内存的优势,成为最优解。

Given a non-empty array of integers, every element appears twice except for one. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Example 1:

Input: [2,2,1]
Output: 1

Example 2:

Input: [4,1,2,1,2]
Output: 4

本菜鸟:

class Solution {
    public int singleNumber(int[] nums) {
         List<Integer> list= new ArrayList();  
    	 int sum = 0;
         for(int i=0;i<nums.length;i++){  
        	 sum += nums[i];
             if(!list.contains(nums[i])){  
                 list.add(nums[i]);  
             }  
         }  
         int res = 0;
         for (int i = 0; i < list.size(); i++) {
             res = list.get(i) + res;
         }
        return 2*res-sum;
    }
}

时间复杂度O(n^2),比较差,所以花费了166ms,效果倒数。

 

稍微改进一下的版本:

@akashs73
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
 	    for(int i=0;i<nums.length;i++){
 	    int a = nums[i];
 	    if(map.containsKey(a)) {
 	    	map.remove(a);
 	    }else {
 	       map.put(a, 1);
 	    }
 	    	
 	  }
 	  return (int) map.keySet().toArray()[0];         

大神的代码:

int x = 0; for(int a: nums) x^=a;
return x;

仅仅两行,时间复杂度为O(n),比这道题的在线提交的100%java代码都快。

这里用到了异或的性质:x^y^x=y;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值