数据结构与算法
米兰的枫
这个作者很懒,什么都没留下…
展开
-
两个集合取交集
#include<stdio.h>#define MAX1 5#define MAX2 4using namespace std;void display(int c[], int n)//遍历输出数组元素{ printf("\n"); for(int i = 0; i < n; i++) printf("%d ", c[i]); printf("\n");}void intersection(int a[],int n,int b[],int m)//求数组a原创 2021-09-17 09:36:14 · 360 阅读 · 0 评论 -
反转一个单链表
题目描述反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?题目解析设置三个节点pre、cur、next(1)每次查看cur节点是否为NULL,如果是,则结束循环,获得结果(2)如果cur节点不是...原创 2021-09-07 09:41:38 · 119 阅读 · 0 评论 -
大数相乘C++
题目描述:计算一个小于100位的整数的平方,要求不能直接赋值给一个整数,然后直接平方(因为会溢出)。如输入157849568214569452,输出其平方值。输入描述:一个较长数字输出描述:该数的平方值思路:因为常规解法必定会溢出,所以只能以字符串的格式读入数字,然后用多项式乘法的思想解决这个问题。#include<iostream>#include<string>#include<vector>using namespace std;int main转载 2021-09-01 17:59:16 · 246 阅读 · 0 评论 -
删除字符串中出现次数最少的字符
//思想:哈希表/*#include <iostream>#include <string>using namespace std;int main(){ int len , min; int a[26];//用于存储每个字符出现的次数 string str, temp; while(cin >> str)//输入多组数据 { for(int i = 0; i < 26; i++) .原创 2021-08-29 19:27:15 · 96 阅读 · 0 评论 -
买卖股票的最佳时机
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。//遍历一遍数组,计算每次到当天为止的最小股票价格和最大利润。class Solution {public: int maxProfit(vector<int>& price转载 2021-08-26 20:35:29 · 57 阅读 · 0 评论 -
最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。思路:哈希表/*使用哈希表记录每个字符的下一个索引(value),关键字(key)是每个元素,然后尽量向右移动尾指针来拓展窗口,并更新窗口的最大长度。如果尾指针指向的元素重复(哈希表中已存在),则将头指针直接移动到窗口中重复元素的右侧。tail 指针向末尾方向移动;如果尾指针指向的元素已经存在于哈希表中: head 指针跳到重复字符的下一位;更新哈希表和窗口长度,保持最大。*/class Solutio原创 2021-08-26 19:33:31 · 60 阅读 · 0 评论 -
两数之和、三数之和
给定一个整数数组 nums[ ] 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。使用哈希表:class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { map<i原创 2021-08-26 19:29:31 · 64 阅读 · 0 评论 -
最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。//动态规划的空间复杂度是偏高的,我们再看一下双指针法。//取中心,然后向两边扩散看是不是对称的就可以了,中心可以是1个元素也可能2个//时间复杂度:O(n^2)//空间复杂度:O(1)class Solution {public: int left = 0; int right = 0; //left和right用于记录当前最长回文子串的两个端点 int maxLength = 0;//extend()函数并没有重新声明原创 2021-08-25 14:54:23 · 58 阅读 · 0 评论 -
杨辉三角形
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。11 11 2 11 3 3 11 4 6 4 1class Solution {public: vector<vector<int>> generate(int numRows) { vector<vector<int>> res(numRows);//有numRows行数据原创 2021-08-25 11:19:32 · 96 阅读 · 0 评论 -
全排列-无重复元素的数组-有重复元素的数组
给定一个不含重复数字的数组 nums ,返回其所有可能的全排列 。你可以按任意顺序返回答案。//方法一:递归,不稳定//给定一个n个元素数组,其全排列的过程可以描述如下: //(1)任意取一个元素放在第一个位置,则有n种选择; //(2)再剩下的n-1个元素中再取一个元素放在第二个位置则有n-1种选择,//此时可以看做对n-1个元素进行全排列; //(3)重复第二步,每一轮都固定一个位置上新的数,直到对最后一个元素进行全排列,//即最后一个元素放在最后一个位置,全排列结束。class So原创 2021-08-25 10:42:30 · 608 阅读 · 0 评论 -
剑指offer题目分类
1.数组(线性表)面试题3:数组中重复的数字:暴力、排序、哈希表、辅助数组、交换属于面试题4:二维数组中的查找:选右上角数字,不断剔除行或列面试题11. 旋转数组的最小数字:顺序查找、二分查找面试题21:调整数组顺序使得奇数位于偶数前面:辅助数组、双指针(交换)面试题39:数组中出现超过一半的数字:哈希表面试题40:最小的k个数:排序、优先队列面试题42:连续子数组的最大和:动态规划面试题45:把数组排成最小的数:全排列、贪心(函数对象)面试题51:数组中的逆序对:分治(归并排序)面试题原创 2021-08-16 22:01:20 · 99 阅读 · 0 评论 -
二叉树、平衡二叉树AVL、红黑树、B树、B+树
概念理解王道考研视频原创 2021-08-11 10:50:28 · 149 阅读 · 0 评论 -
遍历与搜索
一、二叉树的遍历1.深度优先遍历DFT在先L后R的前提下:1)前序遍历V-L-R2)中序遍历L-V-R(递增序列)3)后续遍历L-R-V前序遍历递归方式:vector<int> res;vector<int> PreOrderDFS(TreeNode* root) {//先序递归遍历 if(root==nullptr)//递归结束条件 return; res.push_back(root->val); //先访问当前根节点 PreOrd原创 2021-08-10 22:05:21 · 455 阅读 · 0 评论 -
查找算法及其时间复杂度
一、顺序查找条件:无序或有序队列。原理:按顺序将查找元素与每个元素比较,直到找到查找元素为止。时间复杂度:O(n)int SequenceSearch(int arr[], int value, int n){ int i; for(i = 0; i < n; i++) if(arr[i] == value) return i; return -1;}二、二分查找(折半查找)条件:有序数组原理:查找过程从数组的中间元原创 2021-08-10 19:39:29 · 7049 阅读 · 0 评论 -
八大排序算法:思想、图解、C/C++代码
排序算法保持数字/记录的相对顺序,则该排序算法被称为稳定 ,即,如果您需要排序1 1 2 3,那么如果您不更改前两个1排序的顺序,则算法是稳定的。按键值对进行排序时,这种区别变得更加明显。假设您需要按照键的升序对以下键值对进行排序:INPUT: (4,5), (3,2), (4,3),(5,4) ,(6,4)OUTPUT1:(3,2), (4,5), (4,3),(5,4), (6,4) 稳定OUTPUT2:(3,2), (4,3), (4,5),(5,4), (6,4) 不.原创 2021-08-10 16:05:21 · 175 阅读 · 0 评论 -
01背包问题 动态规划DP
01背包问题#include <iostream>#include<algorithm>using namespace std;const int N=15;//假设物品最多个数int v[N]={0,8,10,6,3,7,2}; //价格int w[N]={0,4,6,2,2,5,1}; //重量int main(){ int m[N][N]={0}; //m[i][j]数组代表在第i件物品,背包容量为j时候能获得最大的价值 int n原创 2021-07-02 17:06:04 · 96 阅读 · 0 评论