算法设计与计算复杂度 笔记
        【摘要】 @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;
}
选择问题
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)