之前写了一篇重点是讲理论,今天重点在于对于题目的分析
题目难度不分先后,有题目来源会直接给出链接或者位置
第一题:消失的数字
题目来源:LeetCode消失的数字
分析
第一种思路分析:
参考代码:
#include <cstdio>
#include <algorithm>using namespace std;int find_disappear(int nums[], int len)
{int res = -1;//保存结果,-1代表值没有被改变//先对数组进行排序sort(nums, nums + len);//需要两个参数,数组头指针与指针,但是这里不包括尾指针,所以指向数组越界的位置for (int i = 0; i < len; i++){if (i != nums[i]) {//这里直接缺少的就是ires = i;}}//这里就是没有匹配到的情况,就是最大的索引if (res == -1) {res = len;} return res;
}int main()
{int arr[] = {0, 1, 2};//这里长度要单独拿出来计算,因为arr传入到find函数里面,会直接当成一级指针来进行处理//指针一般也就是一般windows上4个字节,linux上八个字节来进行处理int len = sizeof(arr) / sizeof(arr[0]);int res = find_disappear(arr, len);printf("缺失的数字是:%d\n", res);return 0;
}
时间复杂度为O(nlogn)明显与题目要求不符合,no_pass
下面是第二种思路分析
#include <cstdio>int find_number(int *nums, int len)
{//正确的长度是int len_correct = len + 1;//计算正确求和值int sum_correct = (len_correct * (len_correct - 1)) / 2;int sum_wrong = 0;//非正确的求和值 //开始轮替,计算非正确的值,然后相减for (int i = 0; i < len; i++){sum_wrong += nums[i];//因为i本身就是从0开始的,所以用i来累加求和}return sum_correct - sum_wrong;
}int main()
{int arr[] = {0, 1, 3};int res = find_number(arr,3);printf("%d\n", res);return 0;
}
时间度O(n),通过
leetcode提交代码:
class Solution {
public:int missingNumber(std::vector<int>& nums) {int len_correct = nums.size() + 1;int sum_correct = (len_correct * (len_correct - 1)) / 2;int sum_wrong = 0;for (int i = 0; i < nums.size(); ++i) {sum_wrong += nums[i];}return sum_correct - sum_wrong;}
};
解决。。。。。持续更新中