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; }
感想:
这道题最直观的解法就是求和作差,很容易想到,而且复杂度很低其次二叉搜索的算法挺难理解的(主要是对二叉搜索的过程比较模糊)
而位运算的算法比较难想到(也好难理解噢=_=),挺巧妙的
相关文章推荐
- Week 4算法分析作业
- Week 2算法分析作业
- Week 9算法分析作业
- Week 6算法分析作业
- Week 13算法分析作业
- Week 18算法分析作业
- Week 10算法分析作业
- Week 14算法分析作业
- Week 12算法分析作业
- Week 8算法分析作业
- Week 16算法分析作业
- Week 15算法分析作业
- Week 17算法分析作业
- (算法分析Week1)Different Ways to Add Parentheses[Medium]
- 《Java数据结构和算法(第二版)》第2章编程作业2.6中noDup方法错误分析及纠正方法
- 【算法设计作业】week2
- (算法分析Week15)Best Time to Buy and Sell Stock with Cooldown[Medium]
- 算法分析与设计课程作业第十七周#1#2
- 算法分析与设计课程作业第十九周#1
- 团队作业week2-软件分析和用户需求调查