Week 3算法分析作业

来源:互联网 发布:数据库的存储原理 编辑:程序博客网 时间:2024/06/15 06:16

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;    }

学习到的解法

解法一:二叉搜索

原理:

首先调用排序算法,对数组从小到大排序
然后使用二叉搜索找到左子树不小于右子树时
返回左子树

代码:

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;}
解法二:位运算

原理:

基于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;}

感想:

这道题最直观的解法就是求和作差,很容易想到,而且复杂度很低
其次二叉搜索的算法挺难理解的(主要是对二叉搜索的过程比较模糊)
而位运算的算法比较难想到(也好难理解噢=_=),挺巧妙的

原创粉丝点击