Single Number

来源:互联网 发布:python 中国地图 编辑:程序博客网 时间:2024/05/29 09:07


Single Number

 
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?

 Hash Table Bit Manipulation

错误做法   ->      O(N^2) 超时

int singleNumber(vector<int>& nums) {        for(int i=0; i<nums.size(); i++){            for(int j=0; j<nums.size(); j++){                if(nums[i] == nums[j])                    continue;            if(j == nums.size())           <span style="white-space:pre"></span> return nums[i];            }        }    }
换思路:要使复杂度:O(n),可在循环外加循环。(不能在一个n循环里面添加任何循环),如下:

int singleNumber(vector<int>& nums) {        int n = nums.size();        int arr[1000];        for(int i=0; i<n; i++)            arr[i] = nums[i];//vector<int>转换成int数组        int count = 0;        //极端        if(n == 0)  {return -1;}//容器为空,不要返回0        if(n == 1)  {return nums[0];}//单数在第一个        return nums[n-1];//单数在最后一个        sort(arr,arr+n);//排序        for(int i = 0; i<n-1; i++){            if(nums[i] == nums[i+1]) count++;            else{                if(count == 0) return nums[i];                count = 0;            }        }    }
最终还是【显示超时】,肯能是在把vector<int>转换成int数组的这个环节上消耗了时间导致。
换思路:vector自带【begin和end】函数。成功解决超时:
int singleNumber(vector<int>& nums) {int n = nums.size();int i = 0;sort(nums.begin(), nums.end());//排序/*if(n == 1)    最后一个元素查不到    return nums[0];*/for (int i = 0; i<n - 1; i += 2){if (nums[i] != nums[i + 1])    return nums[i];}return nums[n-1];}


换思路:用【位运算】的思想合理解决了超时问题。

两相等的数 亦或 得0,最终肯定可以得到一个单数。时间复杂度也为O(N) :

class Solution {public:    int singleNumber(vector<int>& nums) {        int n = nums.size();        int temp = nums[0];        if(n == 0){            return 0;        }        for(int i=1; i<n; i++){            temp = temp^nums[i];        }        return temp;    }};



0 0
原创粉丝点击