之前写了一篇重点是讲理论,今天重点在于对于题目的分析
题目难度不分先后,有题目来源会直接给出链接或者位置
第一题:消失的数字
题目来源: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])
{
//这里直接缺少的就是i
res = 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;
}
};
解决。。。。。持续更新中