C++数据结构和算法代码模板总结——算法部分
数据结构和算法学*了将*两周,及时总结和整理一下相关的知识点温故而知新。
(一)C++双指针,有个经典的问题:荷兰国旗问题。【leetcode】75.颜色分类
public void sortColor(vector<int>& nums){
int low = 0, moid = 0, high = nums.size() -1 ;
while(mid <= high) {
if(nums[mid] == 0) {
swap(nums[low],nums[mid]);
low++;
mid++;
} else if(nums[mid] ==1 ){
mid++;
} else {
swap(nums[mid],mid[high]);
high--;
}
}
}
滑动窗⼝ :滑动窗⼝的核⼼思想是维护⼀个窗⼝ [left, righ
t] ,使得窗⼝内的字符不重复,并不断尝试扩⼤窗⼝以找到最⻓的⽆重复字符⼦串
⽆重复字符的最⻓⼦串
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int left = 0, maxLen = 0;
unordered_map<char, int> charIndex;
for (int right = 0; right < s.size(); ++right) {
if (charIndex.find(s[right]) != charIndex.end()) {
left = max(left, charIndex[s[right]] + 1);
}
charIndex[s[right]] = right;
maxLen = max(maxLen, right - left + 1);
}
return maxLen;
}
};
递归
例子:归并排序(递归的思路):
1.分解:将数组分成两部分,直到每个⼦数组只有⼀个元素。
2.解决:递归地对每个⼦数组进⾏排序。
3.合并:将排序后的⼦数组合并成⼀个有序数组。
#include < iostream >
#include < vector >
using namespace std;
void merge(vector < int > & nums, int left, int mid, int right) {
vector < int > temp(right - left + 1);
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
if (nums[i] <= nums[j]) {
temp[k++] = nums[i++];
} else {
temp[k++] = nums[j++];
}
}
while (i <= mid) {
temp[k++] = nums[i++];
}
while (j <= right) {
temp[k++] = nums[j++];
}
for (i = left, k = 0; i <= right; ++i, ++k) {
nums[i] = temp[k];
}
}
void mergeSort(vector < int > & nums, int left, int right) {
if (left >= right) return;
int mid = left + (right - left) / 2;
mergeSort(nums, left, mid);
mergeSort(nums, mid + 1, right);
merge(nums, left, mid, right);
}
二分法:
int binarySearch(vector < int > & nums, int target) {
int left = 0, 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;
}
动态规划:动态规划最麻烦的点是写出状态转移方程。
零钱兑换问题 :322. 零钱兑换
状态转移⽅程:dp[i] = min(dp[i], dp[i - coin] + 1
写出动态转移方程的通用流程:
1、确定「状态」,也就是原问题和子问题中会变化的变量。由于硬币数量无限,硬币的面额也是题目给定的,只有目标金额会不断地向 base case 靠*,所以唯一的「状态」就是目标金额 amount。
2、确定「选择」,也就是导致「状态」产生变化的行为。目标金额为什么变化呢,因为你在选择硬币,你每选择一枚硬币,就相当于减少了目标金额。所以说所有硬币的面值,就是你的「选择」。
3、明确 dp 函数/数组的定义。我们这里讲的是自顶向下的解法,所以会有一个递归的 dp 函数,一般来说函数的参数就是状态转移中会变化的量,也就是上面说到的「状态」;函数的返回值就是题目要求我们计算的量。就本题来说,状态只有一个,即「目标金额」,题目要求我们计算凑出目标金额所需的最少硬币数量。
所以我们可以这样定义 dp 函数:dp(n) 表示,输入一个目标金额 n,返回凑出目标金额 n 所需的最少硬币数量。
那么根据这个定义,我们的最终答案就是 dp(amount) 的返回值。
代码实现:
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int max = amount + 1;
vector<int> dp(amount + 1, max); // 初始化dp数组,所有值设为amount+1
dp[0] = 0; // dp[0]初始化为0,表示金额为0时需要的硬币数量为0 // 遍历每个金额,从1到amount
for (int i = 1; i <= amount; i++) {
// 遍历每种硬币
for (int j = 0; j < coins.size(); j++) {
// 如果当前硬币面额小于等于当前金额
if (coins[j] <= i) {
// 更新dp[i],取当前值和dp[i - coins[j]] + 1的最小值
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
}
}
} // 如果dp[amount]大于amount,说明无法凑成总金额,返回-1
return dp[amount] > amount ? -1 : dp[amount];
}
};
C++数据结构和算法代码模板总结——算法部分的更多相关文章
- javascript数据结构与算法--高级排序算法
javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- 数据结构与算法系列研究七——图、prim算法、dijkstra算法
图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...
- 在Object-C中学习数据结构与算法之排序算法
笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...
- javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)
javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...
- 数据结构与算法--最短路径之Bellman算法、SPFA算法
数据结构与算法--最短路径之Bellman算法.SPFA算法 除了Floyd算法,另外一个使用广泛且可以处理负权边的是Bellman-Ford算法. Bellman-Ford算法 假设某个图有V个顶点 ...
- javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较
javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...
- hdu 3336:Count the string(数据结构,串,KMP算法)
Count the string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 数据结构之BF算法,kmp算法,三元组,十字链表总结
在这一章中,老师教了我们四种数据结构:BF算法,kmp算法,三元组和十字链表:还给我们讲了2019年团体天体赛中T1-8的AI题 1.对于BF和kmp算法,老师除了在课堂上讲解算法的主要核心思想外,还 ...
- 数据结构与算法系列----最小生成树(Prim算法&Kruskal算法)
一:Prim算法 1.概览 普里姆算法(Prim算法).图论中的一种算法.可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中.不但包含了连通图里的全部顶点(英语:Ve ...
随机推荐
- NumPy学习8
今天学习了NumPy统计函数 16,NumPy统计函数 numpy_test8.py : import numpy as np ''' 16,NumPy统计函数 NumPy 提供了许多统计功能的函数, ...
- CompletableFuture原理及应用场景详解
1.应用场景 现在我们打开各个APP上的一个页面,可能就需要涉及后端几十个服务的API调用,比如某宝.某个外卖APP上,下面是某个外卖APP的首页.首页上的页面展示会关联很多服务的API调用,如果使用 ...
- Envoy 学习笔记(一)
该系列学习笔记是作者为记录云原生基础架构学习过程而写.若想要详细学习 envoy,大家可以去 tetrate 官网和官方文档中学习. 如果没有任何接触云原生的经验,可以在学习相关概念前,去了解以下概念 ...
- java的打包(JAR、War)
一.Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing i ...
- javaWeb之路径
一. 路径写法: 1. 路径分类 a. 相对路径:通过相对路径不可以确定唯一资源 * 如:./index.html * 不以/开头,以.开头路径 * 规则:找到当前资源和目标资源之间的相对位置关系 * ...
- 微信公众号-自定义微信分享(vue)(JS-SDK)
1.需求描述 日常公众号开发中,业务部门对于微信内置分享(右上角->分享到朋友等)效果不太满意,需要我们自定义相关分享效果 1.1微信默认分享效果展示 1.2通过自定义分享后效果展示 1.3微信 ...
- 康谋技术 | 揭秘汽车功能的核心——深度解读ADTF中的过滤器图
在汽车领域,ADTF(Automotive Data and Time-Triggered Framework)是一个强大的工具,用于开发切实可行的汽车功能和复杂的应用程序,实现数据的转换.记录和可视 ...
- 基于Surprise和Flask构建个性化电影推荐系统:从算法到全栈实现
一.引言:推荐系统的魔法与现实意义 在Netflix每年节省10亿美元内容采购成本的背后,在YouTube占据用户80%观看时长的推荐算法中,推荐系统正悄然改变内容消费模式.本文将带您从零开始构建一个 ...
- 贪心算法——Demo1
题干: 假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干. 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼干 j,都有 ...
- 跨境电商 | 踏浪出海:我的Allegro跨境电商实战全景
作者:追梦1819 (同名公众号),本职:高级软件工程师:副业:Allegro跨境电商.运营同名公众号(左上二维码),专注分享成长.跨境电商经历与经验. 版权声明:本文为博主原创文章,转载请附上博文链 ...