您的位置:首页 > 其它

Week 3算法分析作业

2017-09-24 21:08 435 查看

Week 3算法分析作业

LeetCode题目 268. Missing Number

Given an array containing n distinct numbers taken from 0, 1, 2, …, n, find the one that is missing from the array.

For example,

Given nums = [0, 1, 3] return 2.

给定一个n维的数组,数组中的每个元素在0到n之间,且互不相同,找出数组中缺少的数字

例如nums=[0,1,3],则缺少2

我的解法

对数组元素求和,由于每个数都在0到n之间,且互不相同,故对0到n求和后,两和相减则得到对应缺少的数字,复杂度为O(2N)

int missingNumber(vector<int>& nums) {
int sum = 0;
int len = 0;
for(int num : nums){
sum += num;
len++;
}
return ((len+1)*len)/2 - sum;
}


学习到的解法

[b]解法一:二叉搜索[/b]

原理:

首先调用排序算法,对数组从小到大排序

然后使用二叉搜索找到左子树不小于右子树时

返回左子树

代码:

public int missingNumber(int[] nums) {
//binary search
Arrays.sort(nums);
int left = 0,
mid= (left + right)/2;
while(left<right){
mid = (left + right)/2;
if(nums[mid]>mid) right = mid;
else left = mid+1;
}
return left;
}


[b]解法二:位运算[/b]

原理:

基于a^b^b =a的结论,对整个数组做一次扫描,不断的异或操作,若不存在缺失数字,则nums[index]=index一直成立,知道遇到缺失数字,则返回index

代码:

int missingNumber(int[] nums) {
//xor
int res = nums.length;
for(int i=0; i<nums.length; i++){
res ^= i;
res ^= nums[i];
}
return res;
}


感想:

这道题最直观的解法就是求和作差,很容易想到,而且复杂度很低

其次二叉搜索的算法挺难理解的(主要是对二叉搜索的过程比较模糊)

而位运算的算法比较难想到(也好难理解噢=_=),挺巧妙的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: