算法的时间复杂度分析习题专题

之前写了一篇重点是讲理论,今天重点在于对于题目的分析

题目难度不分先后,有题目来源会直接给出链接或者位置

第一题:消失的数字

题目来源:LeetCode消失的数字

 

算法的时间复杂度分析习题专题_第1张图片 

 分析

第一种思路分析:

        算法的时间复杂度分析习题专题_第2张图片 参考代码:

#include 
#include 

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

下面是第二种思路分析

算法的时间复杂度分析习题专题_第3张图片

#include 


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

 算法的时间复杂度分析习题专题_第4张图片

解决。。。。。持续更新中 

 

你可能感兴趣的:(算法刷题,算法)