【算法笔记自学】入门篇(2)——算法初步

 4.1排序

自己写的题解

#include <stdio.h>
#include <stdlib.h>void selectSort(int A[], int n) {for(int i = 0; i < n - 1; i++) { // 修正索引范围int k = i;for(int j = i + 1; j < n; j++) { // 修正索引范围if(A[j] < A[k]) {k = j;}}if (k != i) { // 仅在需要时进行交换int temp = A[i];A[i] = A[k];A[k] = temp;}}
}int main() {int n = 0;scanf("%d", &n);int A[n];for(int i = 0; i < n; i++) {scanf("%d", &A[i]);}selectSort(A, n); // 直接传递数组名for(int i = 0; i < n; i++) {if(i!=n-1){printf("%d ", A[i]);}else{printf("%d", A[i]);}}system("pause"); // 防止运行后自动退出,需头文件stdlib.hreturn 0;
}

 自己写的题解

#include <stdio.h>
#include <stdlib.h>
void insertSort(int A[], int n) {for(int i=1;i<=n-1;i++){int temp=A[i],j=i;while(j>0&&temp<A[j-1]){A[j]=A[j-1];j--;}A[j]=temp;}
}int main() {int n = 0;scanf("%d", &n);int A[n];for(int i = 0; i < n; i++) {scanf("%d", &A[i]);}insertSort(A, n); // 直接传递数组名for(int i = 0; i < n; i++) {if(i!=n-1){printf("%d ", A[i]);}else{printf("%d", A[i]);}}system("pause"); // 防止运行后自动退出,需头文件stdlib.hreturn 0;
}

4.2散列

#include <stdio.h>
#include <stdlib.h>const int maxn = 100010;
int hashTable[maxn] = {0};int main() {int n, x;scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &x);if (x >= 0 && x < maxn) { // 确保x在合法范围内hashTable[x]++;}}for (int i = 0; i < maxn; i++) { // 修正遍历范围if (hashTable[i] != 0) {printf("%d %d\n", i, hashTable[i]); // 修正输出格式}}system("pause"); // 防止运行后自动退出,需头文件stdlib.hreturn 0;
}

 标答

#include <cstdio>
#include <cstring>const int MAXN = 26;
const int MAXL = 1001;
char str1[MAXL], str2[MAXL];
bool hashTable[MAXN] = {false};int getHashKey(char c) {return c - 'a';
}int main () {scanf("%s%s", str1, str2);int len1 = strlen(str1);int len2 = strlen(str2);for (int i = 0; i < len1; i++) {hashTable[getHashKey(str1[i])] = true;}for (int i = 0; i < len2; i++) {printf("%d", hashTable[getHashKey(str2[i])]);printf(i < len2 - 1 ? " " : "\n");}return 0;
}

#include <cstdio>const int MAXN = 26 * 26 * 26;
const int MAXL = 1001;
char str[MAXL];
int hashTable[MAXN] = {0};int getHashKey(char s[]) {return (s[0] - 'A') * 26 * 26 + (s[1] - 'A') * 26 + (s[2] - 'A');
}int main () {int n, m;scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%s", str);hashTable[getHashKey(str)]++;}scanf("%d", &m);for (int i = 0; i < m; i++) {scanf("%s", str);printf("%d", hashTable[getHashKey(str)]);printf(i < m - 1 ? " " : "\n");}return 0;
}

 4.3递归

#include <stdio.h>
#include <stdlib.h>void print(int n) {if (n == 0) {printf("讲你妹的故事啊!快点去睡觉!!!\n");} else {printf("从前有座山,山上有座庙\n庙里有一个老和尚和一个小和尚\n睡前老和尚给小和尚讲故事:\n");print(n - 1);printf("然后老和尚和小和尚就睡觉啦\n");}
}int main() {int n;scanf("%d", &n);print(n);system("pause"); // 防止运行后自动退出,需头文件stdlib.hreturn 0;
}

#include <stdio.h>
#include <stdlib.h>int F(int n) {if(n==1)return 1;if(n==2)return 1;if(n>2)return F(n-1)+F(n-2);
}int main() {int n;scanf("%d", &n);printf("%d",F(n));system("pause"); // 防止运行后自动退出,需头文件stdlib.hreturn 0;
}

#include <stdio.h>
#include <stdlib.h>
const int maxn=11;
int n,P[maxn],hashTable[maxn]={false};
void generateP(int index){if(index==n+1){for(int i=1;i<=n;i++){printf("%d",P[i]);printf(i<n ? " " : "\n");}return;}for(int x=1;x<=n;x++){if(hashTable[x]==false){P[index]=x;hashTable[x]=true;generateP(index+1);hashTable[x]=false;}}
}int main() {n=3;scanf("%d",&n);generateP(1);system("pause"); // 防止运行后自动退出,需头文件stdlib.hreturn 0;
}

4.4贪心

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 100000;    // 箱子数量上限
int a[MAXN];                // 箱子数组
int main() {int n, maxW;            // 箱子数量、载重scanf("%d%d", &n, &maxW);for (int i = 0; i < n; i++) {    // 输入各箱子重量scanf("%d", &a[i]);}sort(a, a + n);                  // 将箱子按重量从小到大排序int num = 0, sum = 0;            // 最大箱子数量、最大累计重量for (int i = 0; i < n; i++) {    // 从小到大遍历箱子if (sum + a[i] <= maxW) {    // 如果加上当前箱子的重量之后没有超过载重num++;                   // 最大箱子数量加1sum += a[i];             // 最大累计重量加上当前箱子的重量} else {                     // 如果超过载重,那么退出循环break;}}printf("%d %d", num, sum);       // 输出最大箱子数量和最大累计重量return 0;
}

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 10000;
struct Interval {    // 区间结构体定义int l, r;
} interval[MAXN];    // 区间数组bool cmp(Interval a, Interval b) {    // 区间的比较函数if (a.l != b.l) {                 // 如果左端点不同,那么按左端点从大到小return a.l > b.l;} else {                          // 否则,按右端点从小到大return a.r < b.r;}
}int main() {int n;scanf("%d", &n);for (int i = 0; i < n; i++) {         // 输入n个区间的左右端点scanf("%d%d", &interval[i].l, &interval[i].r);}sort(interval, interval + n, cmp);    // 将区间数组进行排序int num = 1, lastL = interval[0].l;   // 排序后的第一个区间总是被选中for (int i = 1; i < n; i++) {         // 遍历剩余的区间if (interval[i].r <= lastL) {     // 如果和上一个选中的区间不相交lastL = interval[i].l;        // 那么选中当前区间num++;                        // 并令选中的区间数量加1}}printf("%d", num);                    // 输出选中的区间数量return 0;
}

4.5二分法

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 10000;
int binarySearch(int A[],int left,int right,int x)
{int mid;while(left<=right){mid=(left+right)/2;if(A[mid]==x)return mid;else if(A[mid]>x){right=mid-1;}else{left=mid+1;}}return -1;
}
int main() {int n=0,x=0;scanf("%d %d", &n,&x);int a[n];for (int i = 0; i < n; i++) {         // 输入n个区间的左右端点scanf("%d", &a[i]);}printf("%d", binarySearch(a,0,n-1,x));                    // 输出选中的区间数量return 0;
}

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 10000;
int lower_bound(int A[],int left,int right,int x)
{int mid;while(left<right){mid=(left+right)/2;if(A[mid]>=x){right=mid;}else{left=mid+1;}}return left;
}
int main() {int n=0,x=0;scanf("%d %d", &n,&x);int a[n];for (int i = 0; i < n; i++) {         // 输入n个区间的左右端点scanf("%d", &a[i]);}printf("%d", lower_bound(a,0,n,x));                    // 输出选中的区间数量return 0;
}

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 10000;
int upper_bound(int A[],int left,int right,int x)
{int mid;while(left<right){mid=(left+right)/2;if(A[mid]>x){right=mid;}else{left=mid+1;}}return left;
}
int main() {int n=0,x=0;scanf("%d %d", &n,&x);int a[n];for (int i = 0; i < n; i++) {         // 输入n个区间的左右端点scanf("%d", &a[i]);}printf("%d", upper_bound(a,0,n,x));                    // 输出选中的区间数量return 0;
}

#include <cstdio>const int MAXN = 100000;
int n, a[MAXN], target;int binarySearch() {int l = 0, r = n;while (l < r) {int mid = l + (r - l) / 2;if (a[mid] >= target) {r = mid;} else {l = mid + 1;}}if (l < n && a[l] == target) {return l;} else {return -1;}
}int main() {scanf("%d%d", &n, &target);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}printf("%d", binarySearch());return 0;
}

#include <cstdio>const int MAXN = 100000;
int n, a[MAXN], target;int binarySearch() {int l = 0, r = n;while (l < r) {int mid = l + (r - l) / 2;if (a[mid] > target) {r = mid;} else {l = mid + 1;}}if (l >0 && a[l-1] == target) {return l-1;} else {return -1;}
}int main() {scanf("%d%d", &n, &target);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}printf("%d", binarySearch());return 0;
}

#include <cstdio>
const int MAXN = 100000;
const double eps=1e-6;
double a;
double f(double x){return x*x*x+x*x+x-a;
}
double calSqrt(){double left=-100,right=100,mid;while(right-left>eps){mid=(left+right)/2;if(f(mid)>0){right=mid;}else{left=mid;}}return mid;
}int main() {scanf("%lf",&a);printf("%.2f",calSqrt());return 0;
}

4.6 two pointers

#include <cstdio>const int MAXN = 100000;
int n, k, a[MAXN];int twoSum() {int counter = 0;int i = 0, j = n - 1;while (i < j) {if (a[i] + a[j] == k) {counter++;i++;j--;} else if (a[i] + a[j] < k) {i++;} else {j--;}}return counter;
}int main() {scanf("%d%d", &n, &k);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}printf("%d", twoSum());return 0;
}

#include <cstdio>const int MAXN = 100000;
int n, a[MAXN];
int m, b[MAXN];
int merged[MAXN * 2];void merge() {int i = 0, j = 0, cnt = 0;while (i < n && j < m) {if (a[i] < b[j]) {merged[cnt++] = a[i++];} else {merged[cnt++] = b[j++];}}while (i < n) {merged[cnt++] = a[i++];}while (j < m) {merged[cnt++] = b[j++];}
}int main() {scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}for (int i = 0; i < m; i++) {scanf("%d", &b[i]);}merge();for (int i = 0; i < n + m; i++) {printf("%d", merged[i]);if (i < n + m - 1) {printf(" ");}}return 0;
}

#include <cstdio>const int MAXN = 1000;
int n, a[MAXN];
int merged[MAXN];void merge(int l1, int r1, int l2, int r2) {int i = l1, j = l2, cnt = 0;while (i <= r1 && j <= r2) {if (a[i] < a[j]) {merged[cnt++] = a[i++];} else {merged[cnt++] = a[j++];}}while (i <= r1) {merged[cnt++] = a[i++];}while (j <= r2) {merged[cnt++] = a[j++];}for (i = 0; i < cnt; i++) {a[l1 + i] = merged[i];}
}void mergeSort(int l, int r) {if (l < r) {int mid = (l + r) / 2;mergeSort(l, mid);mergeSort(mid + 1, r);merge(l, mid, mid + 1, r);}
}int main() {scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}mergeSort(0, n - 1);for (int i = 0; i < n; i++) {printf("%d", a[i]);if (i < n - 1) {printf(" ");}}return 0;
}

#include <cstdio>const int MAXN = 1000;
int n, a[MAXN];
int mergedNums[MAXN];int partition(int l, int r) {int temp = a[l];while (l < r) {while (l < r && a[r] > temp) {r--;}a[l] = a[r];while (l < r && a[l] <= temp) {l++;}a[r] = a[l];}a[l] = temp;return l;
}void quickSort(int l, int r) {if (l < r) {int pos = partition(l, r);quickSort(l, pos - 1);quickSort(pos + 1, r);}
}int main() {scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}quickSort(0, n - 1);for (int i = 0; i < n; i++) {printf("%d", a[i]);if (i < n - 1) {printf(" ");}}return 0;
}

4.7其他高效技巧与算法

#include <cstdio>int main() {int n, x, numZero = 0;scanf("%d", &n);long long result = 0;for (int i = 0; i < n; i++) {scanf("%d", &x);if (x == 1) {result += numZero;} else {numZero++;}}printf("%lld", result);return 0;
}

#include <cstdio>
const int MAXN = 100000;
int n,k,a[MAXN];
int mergedNums[MAXN];int partition(int l, int r) {int temp = a[l];while (l < r) {while (l < r && a[r] > temp) {r--;}a[l] = a[r];while (l < r && a[l] <= temp) {l++;}a[r] = a[l];}a[l] = temp;return l;
}void quickSort(int l, int r) {if (l < r) {int pos = partition(l, r);quickSort(l, pos - 1);quickSort(pos + 1, r);}
}
int main() {scanf("%d %d", &n,&k);for(int i=0;i<n;i++){scanf("%d",&a[i]);}quickSort(0, n - 1);for(int i=0;i<n;i++){if(i==k-1)printf("%d",a[i]);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/41298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨境人最怕的封店要怎么规避?

跨境人最怕的是什么&#xff1f;——封店 造成封店的原因很多&#xff0c;IP关联、无版权售卖、虚假发货等等&#xff0c;其中IP关联这个问题导致店铺被封在跨境商家中简直是屡见不鲜 IP关联&#xff0c;是指被海外平台检测到多家店铺开设在同一个站点上的情况。我们知道有些…

统计信号处理基础 习题解答11-12

题目 证明 的MAP估计量为 其中是一个的矢量, 是一个可逆的p*p的矩阵。也就是说&#xff0c;MAP估计量对可逆的线性变换是可以变换的。 解答 已知的联合概率密度 且&#xff1a; 现在知道&#xff1a; 那么为了获得变换后的MAP&#xff0c;首先需要根据求出 根据概率密度变换…

C++入门 容器适配器 / stack queue模拟实现

目录 容器适配器 deque的原理介绍 stack模拟实现 queue模拟实现 priority_queue模拟实现 仿函数 容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总 结)&#xff0c;该种模式是将一个类的接口转换成客户希望…

深度学习Week19——学习残差网络和ResNet50V2算法

文章目录 深度学习Week18——学习残差网络和ResNet50V2算法 一、前言 二、我的环境 三、论文解读 3.1 预激活设计 3.2 残差单元结构 四、模型复现 4.1 Residual Block 4.2 堆叠Residual Block 4.3. ResNet50V2架构复现 一、前言 &#x1f368; 本文为&#x1f517;365天深度学…

Python中异步事件触发

1、问题背景 在Python中&#xff0c;我想创建一个由事件生成控制流程的类结构。为此&#xff0c;我做了以下工作&#xff1a; class MyEvent: EventName_FunctionName {}classmethoddef setup(cls, notificationname, functionname):if notificationname in MyEvent.EventN…

ONLYOFFICE 8.1版本震撼来袭,让办公更高效、更智能

官网链接&#xff1a; 在线PDF查看器和转换器 | ONLYOFFICE 在线办公套件 | ONLYOFFICE 随着科技的不断发展&#xff0c;办公软件已经成为现代企业提高工作效率、实现信息共享的重要工具。在我国&#xff0c;一款名为ONLYOFFICE的在线办公套件受到了越来越多企业的青睐。今天…

[TensorFlow-Lite][深度学习]【快速简介-1】

前言&#xff1a; 很多场景下面我们需要需要把我们的深度学习模型部署到Android,IOS 手机上面. Google 通过TensorFlow Lite 提供了对应的解决方案. 目录&#xff1a; 端侧部署优点 硬件支持 性能 应用案例 一 端侧部署优点 1; 很多场景下面&#xff1a; 无网络,数据无法…

昇思25天学习打卡营第10天|基于MindSpore实现BERT对话情绪识别

基于MindSpore实现BERT对话情绪识别 模型简介数据集模型构建模型验证模型推理自定义推理数据集 模型简介 BERT全称是来自变换器的双向编码器表征量&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;&#xff0c;它是Google于2018年末开发并发…

HTML超链接和锚链接

HTML超链接和锚链接 一、定义 HTML的超链接&#xff08;Hyperlink&#xff09;用于在网页之间创建链接&#xff0c;使用户可以点击这些链接来导航到其他页面或资源。 二、基本语法 1、语法 HTML中的超链接使用a标签来定义 <a href"URL">链接文本</a&g…

yolov8实战——yolov8TensorRT部署(python推理)(保姆教学)

yolov8实战——yolov8TensorRT部署&#xff08;python推理&#xff09;&#xff08;保姆教学&#xff09; 一 、准备好代码和环境安装TensorRt下载代码和安装环境 部署和推理构建ONNX构建engine无torch推理torch推理 最近用到yolov8&#xff0c;但是寻找了一圈才找到了yolov8最…

[SAP ABAP] 版本管理

版本管理是指软件开发过程中各种程序代码、配置文件以及说明文档等文件变更的管理 生成版本 版本管理 对比版本 点击上述版本管理即可进行版本对比操作 补充扩展 我们可以使用事务码SE10对传输请求进行创建、修改、删除、合并以及更改所有者等操作 使用事务码SCC1进行不同cl…

3D生成模型TripoSR完美搭建流程,包含所有问题解决方案!

最近需要使用3D生成模型,无意中看到了TripoSR,觉得效果还行,于是打算在Linux系统上部署一下,结果遇到很多坑,在这里写一下详细的部署流程和部署过程中遇到的问题。 下面是TripoSR的源码地址。 GitHub - VAST-AI-Research/TripoSRContribute to VAST-AI-Research/TripoSR…

【Portswigger 学院】文件上传

教程和靶场来源于 Burpsuite 的官网 Portswigger&#xff1a;File upload vulnerabilities - PortSwigger 原理与危害 很多网站都有文件上传的功能&#xff0c;比如在个人信息页面允许用户上传图片作为头像。如果网站应用程序对用户上传的文件没有针对文件名、文件类型、文件内…

前端基础:JavaScript(篇一)

目录 JavaScript概述 JavaScript历史&#xff1a; 须知&#xff1a; 基本语法 变量 代码 运行 数据类型 1、数值型(number)&#xff1a; 代码 运行 2、布尔型(boolean)&#xff1a; 代码 运行 3、字符串型&#xff1a; 代码 运行 4、 undefined类型 代码…

TCP的pop网络模式

TCP的pop网络模式 1、tcp连接的状态有以下11种 CLOSED&#xff1a;关闭状态LISTEN&#xff1a;服务端状态&#xff0c;等待客户端发起连接请求SYN_SENT&#xff1a;客户端已发送同步连接请求&#xff0c;等待服务端相应SYN_RECEIVED&#xff1a;服务器收到客户端的SYN请请求&…

MySQL 基本语法讲解及示例(下)

第六节&#xff1a;如何检索资料 在本节中&#xff0c;我们将介绍如何使用SQL语句检索数据库中的资料&#xff0c;具体包括选择特定列、排序、条件过滤以及组合排序等操作。我们以一个名为student的表格为例&#xff0c;演示不同的检索方法。 初始表格 student student_idname…

Python中frozenset,秒变不可变集合,再也不用担心多线程了!

目录 1、Frozenset基础介绍 🌐 1.1 Frozenset定义与创建 1.2 不可变集合特性 1.3 与Set的区别对比 2、Frozenset操作实践 🧩 2.1 初始化与添加元素尝试 2.2 成员测试: in & not in 2.3 集合运算: 并集、交集、差集 2.4 使用场景示例: 字典键、函数参数默认值 …

劲爆!华为享界两款新车曝光,等等党有福了

文 | AUTO芯球 作者 | 雷慢 劲爆啊&#xff0c;北汽的一份环境影响分析报告&#xff0c; 不仅曝光了享界S9的生产进展&#xff0c; 还泄露了自家的另两款产品&#xff0c; 第一款是和享界S9同尺寸的旅行车&#xff0c; 我一看&#xff0c;这不是我最喜欢的“瓦罐”吗&…

v-html 空格/换行不生效

接口返回的内容如下&#xff1a;有空格有换行&#xff0c;但 使用v-html无效 需加css样式 white-space: pre-wrap; <div class"pretty-html" v-html"Value"></div>.pretty-html {white-space: pre-wrap; /* 保留空格和换行&#xff0c;并允许…

掌握麦肯锡精英的6个技巧,你也能成为1%的精英!

不知道大家有没有想过&#xff0c;我们和那些全球顶尖精英的差距可能只有1%&#xff0c;只是99%的人还不知道这件事。 今天给大家推荐一本好书&#xff0c;《你和麦肯锡精英的差别只有1%》。优思学院发现&#xff0c;在我们的六西格玛、精益管理的学生中很多人对自己没有自信。…