
数据结构与算法
CurryCoder
个人微信公众号:CurryCoder的程序人生
所有代码在此https://github.com/cdlwhm1217096231,欢迎各位小伙伴star、follow、fork
个人主页:https://cdlwhm1217096231.github.io/
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
前缀和算法原理及代码
一维前缀和算法a.原数组{a[1], a[2], a[3], …, a[n]},注意:数组下标从1开始,同时令S[0] = 0。b.前缀和S[i]:S[i] = a[1] + a[2] + … + a[i]Q1:S[i]如何求出?A1:for循环遍历一下原数组,其中S[i] = S[i-1] + a[i]Q2:S[i]的作用?A2:能够快速求出数组中任意一段范围内(如:[l, r])的和 ,即S[r] - S[l-1]#include <iostream>原创 2020-11-10 23:06:57 · 2261 阅读 · 0 评论 -
高精度算法
四种类型高精度算法[仅对C++而言]1.A+B:两个大整数(A和B的位数为10^6)相加a.利用数组存储大整数:将大整数的每一位存在一个数组中,注意:数组的第0位应该存大整数的个位数,其余位依次类推。原因:考虑到两个大整数相加过程中会产生进位C,便于处理进位C。b.模拟人工加法过程:A[i] + B[i] + C#include <iostream>#include <vector>using namespace std;const int N = 1e6 + 1原创 2020-11-04 23:43:00 · 547 阅读 · 1 评论 -
整数二分查找原理及代码模板
1.整数二分算法原理ps:数组具有单调性,则一定可以使用整数二分算法;但是,能够使用整数二分算法的数组,数组未必具有单调性。整数二分算法的本质:给定一个区间,在区间中定义了某种性质。该性质在区间的右半区间是满足的,但在左半区间是不满足的。二分法的目的就是为了寻找满足某种性质的边界点。算法主要步骤:a.确定区间的中间点midb.根据实际问题编写check()函数,判断mid是否满足区间[l, r]的某种性质c.更新区间端点模板1图解:模板2图解:2.代码模板1// 根据实际原创 2020-10-29 23:32:30 · 410 阅读 · 0 评论 -
归并排序原理及代码模板
1.归并排序[基于分治思想]算法主要步骤:a.确定区间的分界点即区间[l, r]的中间位置:mid = l + r >> 1,分成左、右两边;b.递归排序左边、右边;c.将左、右两边有序的数组合二为一[重点];归并排序时间复杂度:nlogn,解释如下图所示:2.代码模板#include <iostream>using namespace std;const int N = 1000010;int q[N], tmp[N]; // tmp[N]用于存原创 2020-10-28 23:19:56 · 337 阅读 · 0 评论 -
快速排序原理及代码模板
1.快速排序[基于分治思想]算法主要步骤:a.确定分界点x:q[l]、q[(l+r)/2]、q[r]、随机选择一个数b.调整区间[重点]:(1).使得左半边区间的数都小于等于x(2).使得右半边区间的数都大于等于xc.递归:递归处理左、右两边区间双指针法实现快速排序:无需开辟额外空间注意:边界问题!2.代码模板#include <iostream>using namespace std;const int N = 1e6 + 10;int n;原创 2020-10-27 23:15:50 · 289 阅读 · 0 评论 -
动态规划DP----背包问题总结
1. 01背包问题01背包的算法思想01背包的代码框架#include <iostream>#include <vector>#include <string>#include <algorithm>using namespace std;const int N = 1010;int n, m; // n表示所有物品的个...原创 2019-09-13 22:24:48 · 578 阅读 · 0 评论 -
LeetCode01_二分法专题
一.二分法基本思想二分法做题流程(重要):1.确定二分的边界2.编写二分的代码框架3.设计一个check(性质)4.判断一下区间如何更新5.如果更新方式写的是l = mid, r = mid - 1,那么就在计算mid的时候加上1二.二分法典型习题1.LeetCode-69 求解Sqrt(x)解题思路:因为求的是sqrt(x),则x的取值范围是[0, x],因此在此...原创 2019-09-13 11:25:35 · 306 阅读 · 0 评论 -
剑指offer第二版答案详细版(带详细解题思路)
1.滑动窗口的最大值(剑指offer原59题)解题思路:其实是一个队列的问题,用一个队列去维护当前窗口中的所有元素;首先将超出窗口中的队头元素先删掉,然后将新的元素插入当前窗口中,插入时要判断新插入的元素与队尾元素的大小,如果队尾元素较小,则先删除队尾元素再插入。#include <iostream>#include <vector>#include <deq...原创 2019-09-02 23:12:04 · 765 阅读 · 0 评论 -
堆排序算法实现思想个人理解
1.概述:堆排序是简单选择排序的改进算法,简单选择排序在待排序的个数据中选择一个最小的元素需要进行n-1次的比较,但是并没有将每一次循环的结果保存下来,在下一次循环中,有很多比较已经在上一次的循环中做过了,但由于上一次循环时没有保存这些比较结果,所以下一次循环时又要重复这些比较操作,隐藏数据的比较次数较多。2.大顶堆与小顶堆从上面的两幅图可以看出,它们都是完全二叉树。下面给出堆的定义:...原创 2019-05-29 17:54:04 · 1976 阅读 · 0 评论 -
希尔排序算法实现思想个人理解
1.原理:希尔排序是对直接插入排序的改进,建立在直接排序的基础上实现的。因为直接插入排序适合那些数据本身就是基本有序的或者数据量比较小的情况。但是,实际中数据量小或数据基本有序属于特殊情况,这就是直接插入排序的局限性。希尔排序的基本思想就是当有大量的数据需要排序时,可以将大量的数据分组成若干子序列,此时每个子序列的数据比较少,可以对每个子序列使用直接插入排序。当整个序列基本有序时(基本有序:小的...原创 2019-05-29 16:48:02 · 2024 阅读 · 0 评论 -
直接插入排序算法实现思想个人理解
1.原理:由于是直接插入排序,下面假设原始数组中已经有一个元素是5,待插入的元素是3,所以下面的程序中待插入元素的下标i从2开始。**数组下标0的位置作为哨兵,暂存待插入的元素。**直接插入算法的主要步骤分3步:首先待插入元素的下标i从2开始移动,循环到数组最大长度对应的索引处L->len;然后,将待插入的元素与前一个元素即下标是i-1的元素进行比较。如果前一个元素比待插入的元素大,此时执...原创 2019-05-29 16:27:54 · 3474 阅读 · 0 评论 -
快速排序算法实现思想个人理解
1.概述快速排序是冒泡排序的改进算法。它也是通过不断比较和移动交换来实现排序的,只不过它的实现增大了记录的比较和移动的距离,将关键字较大的元素从前面直接放到后面,关键字较小的元素直接从后面放到前面,从而减小了比较次数和交换次数。2.原理通过一趟排序将待排序数据分割成独立的两个子序列,其中左边的子序列均比右边的子序列中的元素小,然后分别对左右两个子序列继续进行排序,达到整个序列有序的...原创 2019-05-31 11:39:27 · 13364 阅读 · 4 评论 -
归并排序算法实现思想个人理解
1.原理:假设初始待排序数据有n个,可以将n个数据看成n个独立的子序列,因此每个子序列的长度为1,然后两两合并,得到[n/2]个长度为2或1(注意如果n为奇数时,就会出现多出一个元素无法与其他元素合并)的有序子序列;再两两合并,一种重复下去,直到得到一个长度为n的有序序列为止,这种排序方法为2路排序方法。2.递归方法来实现归并排序原理:使用递归方法来实现归并排序时,核心思想是两个有序子序...原创 2019-05-30 17:07:49 · 15297 阅读 · 3 评论 -
字符串翻转的两种方法(C++版本)
#include "iostream"#include "cstring"#include "malloc.h"using namespace std;int main(){ /*--------------------------------方法1-----------------------------*/ char *src = "hello,world"; /...原创 2019-04-13 10:51:06 · 989 阅读 · 0 评论 -
二叉树前序、中序、后序遍历相互求法(转载)
博客原文转载 2019-04-11 17:29:58 · 304 阅读 · 0 评论 -
前缀、中缀、后缀表达式(逆波兰表达式)
1.博客转载链接参考博客转载 2019-04-05 21:21:11 · 319 阅读 · 0 评论 -
常见排序算法复杂度总结
常用口诀不稳定排序算法: 快、选、希、堆初始数据元素排列顺序与比较次数无关的排序算法: 一堆(堆排序)海归(归并排序)选(选择排序)基友原创 2019-04-04 09:27:56 · 425 阅读 · 0 评论 -
选择排序算法实现思想个人理解
一、选择排序算法个人理解如果有N个元素需要排序,首先从N个元素中找到最小的那个元素,然后与索引ix=0位置上的元素进行交换(如果没有比原来索引ix=0位置上的元素小就不用交换),接着再从剩下的N-1个元素中找出最小的元素,再与索引ix=1位置上的元素进行交换;之后,再从剩下的N-2个元素中找出最小的元素,再与索引ix=2位置上的元素进行交换,…重复上面的操作,一直到完全排序完成为止。具体排序过...原创 2019-03-17 22:03:32 · 804 阅读 · 0 评论 -
冒泡排序算法实现思想个人理解
一、冒泡排序算法个人理解主要是以两个形成嵌套的for循环来完成的。外层的for循环以索引ix的值来逐个访问序列中的每个元素,ix的值由0开始增加到size(sequence) - 1,当外部的for循环迭代完成后,由ix索引取出的元素已经被放在正确的位置上了。放元素的操作是由内层的for循环来实现的,内层for循环的索引的值jx从ix+1依次递增到size(sequence) - 1为止,它比...原创 2019-03-11 09:39:16 · 1381 阅读 · 0 评论