最近开始了在LeetCode上的刷题,现记录其中比较重要的算法知识点。
题目描述:
Given an 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?
解题思路1:
首先将数组中数据排序,然后每次将前一个和后一个比较,同时计数,如果计数为1,那么表示上一个就是需要的元素。使用java实现如下:
class Solution {
public int singleNumber(int[] nums) {
for(int i=0;i<nums.length-1;i++){
int min=i;
for(int j=i+1;j<nums.length;j++){
if(nums[min]>=nums[j]){
min=j;
}
}
int temp=nums[i];
nums[i]=nums[min];
nums[min]=temp;
}
for(int i=0;i<nums.length;i++){
System.out.println(nums[i]+" "+i);
}
int count=1;
for(int k=1;k<nums.length;k++){
if(nums[k]==nums[k-1]){
count++;
continue;
}else{
if(count==1){
return nums[k-1];
}
count=1;
}
}
return nums[0];
}
}这个可以得到正确的答案,但是会超时,因为题目规定在线性时间内得到结果,显然,排序就无法在线性时间内完成。解题思路2:
通过异或来得到答案。比如:1^1=0, 1^2^1=(1^1)^2=2,其实仔细看题目,我们会发现题目已经提示每个数字都出现两次这个特点,这个特点可以很好的被利用。实现代码如下:
class Solution {
public int singleNumber(int[] nums) {
int result=0;
for(int i=0;i<nums.length;i++){
result=nums[i]^result;
}
return result;
}
}
本文介绍了一种LeetCode上的经典算法问题——寻找数组中唯一出现一次的数字。提供了两种解决方案,一种是通过排序和计数的方式找到目标数字,但时间复杂度较高;另一种则是利用异或操作符的特性,实现了线性时间复杂度和常数空间复杂度的要求。

1800

被折叠的 条评论
为什么被折叠?



