算法设计与计算复杂度 笔记

举报
海轰Pro 发表于 2022/08/29 16:46:02 2022/08/29
865 0 0
【摘要】 @TOC 前言Hello!非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ 自我介绍 ଘ(੭ˊᵕˋ)੭昵称:海轰标签:程序猿|C++选手|学生简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研。学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语! 唯有努力💪 知其然 知其所以然! 本文仅记录自己感兴趣的内...

@TOC

在这里插入图片描述

前言

Hello!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
 
自我介绍 ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研。
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
 
唯有努力💪
 

知其然 知其所以然!

 
本文仅记录自己感兴趣的内容

参考:https://www.cnblogs.com/SiriusZHT/p/14310776.html

汉诺塔问题

#include<iostream>
using namespace std;
static int counts=1;
void move(char src,char dest)
{
	cout<<"第"<<counts<<"步:  "<<src<<"------->"<<dest<<endl;
	counts++;
}
// hanoi: 从src 全部移动至 dest 
void hanoi(int n,char src,char medium,char dest)
{
	if(n==1)
		move(src,dest);
	else
	{
        // 分为两部分 上面n-1块 最下面1块
       
        // 先把上半部分(n-1) 从src移动至medium
		hanoi(n-1,src,dest,medium);
        // 再把最后一部分(1)移动至dest
		move(src,dest);
        // 最后再把上半部分(n-1) 从medium移动至dest
		hanoi(n-1,medium,src,dest);
	}
}
int main()
{
	int m;
	//cin>>m;
	cout<<"请输入汉诺塔  层数:"<<endl;
    cin>>m;
	cout<<"步骤是:"<<endl;
	hanoi(m,'A','B','C');

	return 0;
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
汉诺塔问题

class Solution {
public:
    void move(vector<int>& src, vector<int>& dest) {
        dest.push_back(src.back());
        src.pop_back();
    }
    void hanoi(int n, vector<int>& src, vector<int>& medium, vector<int>& dest) {
        if(n == 1) {
            move(src, dest);
        } else {
            hanoi(n-1, src, dest, medium);
            move(src, dest);
            hanoi(n-1, medium, src, dest);
        }
    }
    void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
        int n = A.size();
        hanoi(n, A, B, C);
    }
};

搜索问题

二分查找

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        while(left <= right) {
            int mid = left + (right - left)/2;
            if(nums[mid] == target) {
                return mid;
            } else if(nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return -1;
    }
};

排序问题

快速排列

#include <iostream>
#include <vector>
using namespace std;
int partition(vector<int> &nums, int left, int right)
{
    srand((unsigned)time(NULL));
    int randomIndex = rand() % (right - left + 1) + left;
    swap(nums[left], nums[randomIndex]);

    int pivot = nums[left];
    int lt = left;
    for (int i = left + 1; i <= right; ++i)
    {
        if (nums[i] < pivot)
        {
            ++lt;
            swap(nums[i], nums[lt]);
        }
    }
    swap(nums[left], nums[lt]);
    return lt;
}
void quickSort(vector<int> &nums, int left, int right)
{
    if (left < right)
    {
        int pIndex = partition(nums, left, right);
        quickSort(nums, left, pIndex - 1);
        quickSort(nums, pIndex + 1, right);
    }
};

int main()
{
    vector<int> test(20);
    srand((unsigned)time(NULL));
    for (int i = 0; i < test.size(); ++i)
    {
        test[i] = rand() % (100);
    }
    cout << "排序前:" << endl;
    for (int i = 0; i < test.size(); ++i)
    {
        cout << test[i] << " ";
    }
    cout << endl;
    cout << "排序后:" << endl;
    quickSort(test, 0, test.size() - 1);
    for (int i = 0; i < test.size(); ++i)
    {
        cout << test[i] << " ";
    }
    cout << endl;
    return 0;
}

选择问题

数组中的第K个最大元素

class Solution
{
public:
  int partition(vector<int> &nums, int left, int right)
  {
    srand((unsigned)time(NULL));
    int randomIndex = rand() % (right - left + 1) + left;
    swap(nums[left], nums[randomIndex]);

    int pivot = nums[left];
    int lt = left;
    for (int i = left + 1; i <= right; ++i)
    {
      if (nums[i] < pivot)
      {
        ++lt;
        swap(nums[i], nums[lt]);
      }
    }
    swap(nums[left], nums[lt]);
    return lt;
  }
  int quickSort(vector<int> &nums, int left, int right, int k)
  {
    int pIndex = partition(nums, left, right);
    if (pIndex == nums.size() - k)
    {
      return nums[pIndex];
    }
    else
    {
      return pIndex < nums.size() - k ? quickSort(nums, pIndex + 1, right, k) : quickSort(nums, left, pIndex - 1, k);
    }
  }
  int findKthLargest(vector<int> &nums, int k)
  {
    int n = nums.size();
    return quickSort(nums, 0, n - 1, k);
  }
};

整数划分

#include <iostream>
using namespace std;
int a[50] = {0};
int n, sum = 1;
bool flag = true;
void dfs(int num, int step) {
	if(num == n) {
		if(sum % 4 != 1) cout << ";";
		cout << num << "=" << a[1];
		for(int i = 2; i < step; i++) cout << "+" << a[i];
		if(sum % 4 == 0) cout << endl;
		sum++;
	}
	if(num > n) return ;
	for(int i = 1; i <= n; i++) {
		a[step] = i;
		if(a[step] >= a[step - 1]) dfs(num + i, step + 1);
	}
}
int main() {
	cin >> n;
	dfs(0, 1);
	return 0;
}

结语

文章仅作为个人学习笔记记录,记录从0到1的一个过程

希望对您有一点点帮助,如有错误欢迎小伙伴指正

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。