数据结构与算法
分享数据结构与算法知识
超级D洋葱
人生苦短,我用Python!
展开
-
计算斐波拉契数列的2种方式(C++实现)
#include <iostream>using namespace std;// 求斐波拉契数,方法1:递归int fib1(int n){ if(n <=1) return n; return fib1(n-1) + fib1(n-2);}// 求斐波拉契数,方法2int fib2(int n){ if(n<=1) return n; int first = 0; int second = 1; for(int i=0;i<n-1;i++){原创 2021-03-21 15:28:20 · 480 阅读 · 0 评论 -
数据结构与算法简介
作者:阿阿阿阿毛链接:https://www.jianshu.com/p/d8694b7aec761. 数据结构数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。简单地说, 程序设计 = 数据结构 + 算法。数据结构,顾名思义,就是数据之间的结构关系,或者理解成数据元素相互之间存在的一种或多种特定关系的集合。当然这些概念都是大学喜欢考的,我们没必要纠结于这个概念,有自己恰当的、并且可以为他人所接受的解释就可以。数据结构中的结构,也就是我们研究的主体转载 2021-03-24 15:17:15 · 429 阅读 · 0 评论 -
时间复杂度与空间复杂度介绍
文章目录1. 时间复杂度1.1 定义1.2 推导时间复杂度的原则1.3 各时间复杂度曲线2. 空间复杂度2.1 定义2.2 常用空间复杂度1. 时间复杂度1.1 定义若存在函数 ,使得当 趋向无穷大时, 的极限值为不等于 0 的常数,则称 是 的同数量级函数,记作 ,称 为算法的渐进时间复杂度,简称 时间复杂度,用大 O 来表示,称为大 O 表示法;1.2 推导时间复杂度的原则若运行时间是常数量级,则用常数 1 表示;只保留时间函数中最高阶项,如 ,保留最高阶项后,成为 ;若最高阶转载 2021-03-24 15:24:24 · 189 阅读 · 1 评论 -
算法分析
文章目录1. 算法的时间复杂度分析1.1 函数渐进增长1.2 算法时间复杂度1.2.1 大O表示法1.2.2 常见的大O阶1.2.3 函数调用的时间复杂度分析1.2.4 最坏情况2. 算法的空间复杂度分析2.1 java中常见内存占用2.2 算法的空间复杂度研究算法的最终目的就是如何花更少的时间,如何占用更少的内存去完成相同的需求,并且也通过案例演示了不同算法之间时间耗费和空间耗费上的差异,但我们并不能将时间占用和空间占用量化,因此,接下来我们要学习有关算法时间耗费和算法空间耗费的描述和分析。有关算法时间原创 2021-03-28 15:48:09 · 1009 阅读 · 0 评论 -
数据结构和算法概述
文章目录1. 什么是数据结构?2. 数据结构分类2.1 逻辑结构分类2.2 物理结构分类3. 什么是算法?4. 算法初体验4.1 例14.2 例21. 什么是数据结构?官方解释:数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。大白话:数据结构就是把数据元素按照一定的关系组织起来的集合,用来组织和存储数据2. 数据结构分类传统上,我们可以把数据结构分为逻辑结构和物理结构两大类。2.1 逻辑结构分类逻辑结构是从具体问题中抽象出来的模型,是抽象意原创 2021-03-28 12:07:40 · 203 阅读 · 0 评论 -
什么是大O表示法
“大O表示法”是一种特殊的表示法,指出了算法的速度有多快。算法的运行时间以不同的速度增加“算法的运行时间以不同的速度增加”这句话应该如何理解呢?下面我们通过 来看看这句话到底想表达什么。小明现在需要编写一个查找算法,这个算法服务于学校图书馆,目的是帮助童鞋们能够快速的找到自己需要的书籍所在位置。假设小明现在只会“二分查找”和“简单查找”。一方面,二分查找的速度很快,小明必须在 10 秒钟内找到书籍所在位置,否则童鞋们没有更多耐心等待。另一方面,简单查找算法编写起来更容易,因此出现 bug 的可能性更转载 2021-03-24 15:31:03 · 942 阅读 · 0 评论 -
排序算法之插入排序(Java实现)
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。插入排序的工作方式非常像人们排序一手扑克牌一样。开始时,我们的左手为空并且桌子上的牌面朝下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较,如下图所示:需求:排序前:{4,3,2,10,12,1,5,6}排序后:{1,2,3,4,5,6,10,12}排序原理:1.把所有的元素分为两组,已经排序的和未排序的;2.找到未排序的组中的第一个元原创 2021-03-28 19:25:17 · 252 阅读 · 0 评论 -
排序算法之归并排序(Java实现)
文章目录1. 递归2. 归并排序在学习归并排序之前,我们得先学习一下递归算法1. 递归定义:定义方法时,在方法内部调用方法本身,称之为递归。public void show() { System.out.println("aaaa"); show();}作用:它通常把一个大型复杂的问题,层层转换为一个与原问题相似的,规模较小的问题来求解。递归策略只需要少量的程序就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。注意事项:在递归中,不能无限制的调用自己原创 2021-03-29 22:21:10 · 540 阅读 · 0 评论 -
排序算法之快速排序(Java实现)
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。需求:排序前:{6, 1, 2, 7, 9, 3, 4, 5, 8}排序后:{1, 2, 3, 4, 5, 6, 7, 8, 9}排序原理:1.首先设定一个分界值,通过该分界值将数组分成左右两部分;2.将大于或等于分界值的数据放到到数组右边,小于分原创 2021-03-30 07:21:29 · 729 阅读 · 0 评论 -
常见排序算法及其复杂度
原创 2021-03-24 15:40:00 · 197 阅读 · 0 评论 -
排序算法之冒泡排序【稳定】(C++实现)
1. 简介冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。2. C++实现#include <iostrea原创 2021-03-26 13:11:54 · 340 阅读 · 0 评论 -
排序算法之归并排序【稳定】(C++实现)
文章目录1. 预备知识1.1 归并总体思路1.2 递归思想1.3 排序前后已排序的数组(Java)1.4 排序部分已排序的数组(Java)2. C++实现(递归版本)3. C++实现(迭代版本)1. 预备知识归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);原创 2021-03-28 10:53:00 · 525 阅读 · 0 评论 -
排序算法之希尔排序(Java实现)
希尔排序是插入排序的一种,又称“缩小增量排序”,是插入排序算法的一种更高效的改进版本。前面学习插入排序的时候,我们会发现一个很不友好的事儿,如果已排序的分组元素为{2,5,7,9,10},未排序的分组元素为{1,8},那么下一个待插入元素为1,我们需要拿着1从后往前,依次和10,9,7,5,2进行交换位置,才能完成真正的插入,每次交换只能和相邻的元素交换位置。那如果我们要提高效率,直观的想法就是一次交换,能把1放到更前面的位置,比如一次交换就能把1插到2和5之间,这样一次交换1就向前走了5个位置,可原创 2021-03-28 20:20:00 · 370 阅读 · 0 评论 -
常用排序算法 C++ 实现
文章目录1. 冒泡排序2. 选择排序3. 插入排序4. 希尔排序5. 归并排序6. 快速排序1. 冒泡排序#include <iostream>#include <vector>//冒泡排序void BubbleSort(std::vector<int>& arr){ int length = arr.size(); if(length<2) return; for(int i=length-1; i>=0; --原创 2021-08-05 17:36:24 · 1272 阅读 · 0 评论 -
排序的稳定性
文章目录1. 稳定性的定义2. 常见排序算法的稳定性2.1 冒泡排序(稳定)2.2 选择排序(不稳定)2.3 插入排序(稳定)2.4 希尔排序(不稳定)2.5 归并排序(稳定)2.6 快速排序(不稳定)1. 稳定性的定义数组arr中有若干元素,其中A元素和B元素相等,并且A元素在B元素前面,如果使用某种排序算法排序后,能够保证A元素依然在B元素的前面,可以说这个该算法是稳定的。稳定性的意义:如果一组数据只需要一次排序,则稳定性一般是没有意义的,如果一组数据需要多次排序,稳定性是有意义的。例如要原创 2021-03-30 07:27:57 · 1385 阅读 · 0 评论 -
排序算法之希尔排序【不稳定】(C++实现)
1. 简介希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。(1) 第一趟(2) 第二趟(3)第三趟,得到最终结果2原创 2021-03-26 13:40:55 · 738 阅读 · 0 评论 -
排序算法之插入排序【稳定】(C++实现)
1. 简介插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 [1] 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 [2] 。2.C++实现#include <iostream>using namespace std;void insertion_so原创 2021-03-26 13:27:26 · 323 阅读 · 0 评论 -
排序算法之选择排序【不稳定】(C++实现)
文章目录1. 简介2. C++实现1. 简介选择排序是最简单,但是也是最没用**【时间复杂度O(n^2),不稳定】**的排序算法,也有优化空间。算法步骤:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。重复第二步,直到所有元素均排序完毕。动画演示:2. C++实现#include <iostream>#include <vector>#include <algorith原创 2021-03-24 15:57:50 · 522 阅读 · 0 评论 -
排序算法之冒泡排序(Java实现)
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。需求:排序前:{4,5,6,3,2,1}排序后:{1,2,3,4,5,6}排序原理:比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值。代码实现:public class Bubble { /* 对数组a中的元素进行排序 */ public原创 2021-03-28 16:32:21 · 200 阅读 · 0 评论 -
排序算法之选择排序(Java实现)
选择排序是一种更加简单直观的排序方法。需求:排序前:{4,6,8,7,9,2,10,1}排序后:{1,2,4,5,7,8,9,10}排序原理:1.每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较,如果当前索引处的值大于其他某个索引处的值,则假定其他某个索引出的值为最小值,最后可以找到最小值所在的索引2.交换第一个索引处和最小值所在的索引处的值代码实现:public class Selection { /* 对数组a中的元素进行排序 */原创 2021-03-28 17:01:11 · 233 阅读 · 0 评论 -
牛客网C++刷题《华为机试》
文章目录HJ1 字符串最后一个单词的长度HJ2 计算字符个数HJ3 明明都随机数HJ4 字符串分隔HJ5 进制转换HJ6 质数因子HJ7 取近似值HJ8 合并表记录HJ9 提取不重复的整数HJ10 字符个数统计HJ11 数字颠倒HJ12 字符串反转HJ13 句子逆序HJ14 字符串排序HJ15 求int型数组在内存中储存时1的个数HJ21 简单密码破解HJ22 汽水瓶HJ26 字符串排序HJ34 图片整理HJ35 蛇形矩阵HJ37 统计每个月兔子的总数HJ38 求小球落地5次后所经历的路程和第5次反弹的高度原创 2021-03-15 19:07:17 · 2975 阅读 · 0 评论 -
C++反转单链表
#include <iostream>using namespace std;struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};class Solution {public: ListNode* ReverseList(ListNode* pHead) { ListN原创 2021-03-13 14:55:14 · 172 阅读 · 0 评论 -
牛客网C++刷题《剑指offer》
JZ1 二维数组中的查找class Solution {public: bool Find(int target, vector<vector<int> > array) { //判断数字是否为空 if(array.size()==0 || array[0].size() == 0) return false; for(const auto &vec : array)原创 2021-03-15 19:05:46 · 369 阅读 · 0 评论 -
牛客网刷题:C/C++工程师能力评估(共20题)
文章目录1234567 下面关于虚函数和函数重载的叙述不正确的是(A)8 处理a.html文件时,以下哪行伪代码可能导致内存越界或者抛出异常(B)9101112131415 写出下面程序的输出结果1617181920先看一下我的惨状:1测试代码:#include <iostream>int main() { std::cout << "int *p1 = new int[10]; \n"; int *p1 = new int[10]; for原创 2021-02-22 21:55:29 · 1163 阅读 · 0 评论 -
LeetCode动画解题:26. 删除有序数组中的重复项(C++实现)
题目:双指针法解题:代码示例(C++):#include <iostream>#include <vector>#include <stack>using namespace std;class Solution {public: int removeDuplicates(vector<int>& nums) { if(nums.size()==0) return 0; int lef原创 2021-03-17 22:41:33 · 213 阅读 · 0 评论 -
[LeetCode C++] 1. 两数之和
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/two-sum题目:方法一:暴力枚举class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { int n = nums.size(); for (int i = 0; i < n; ++i) { for原创 2021-07-24 21:18:03 · 194 阅读 · 0 评论 -
[LeetCode C++] 237. 删除链表中的节点
[LeetCode C++]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list/题目:解法:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {}原创 2021-07-25 16:08:20 · 289 阅读 · 0 评论 -
[LeetCode C++] 122. 买卖股票的最佳时机 II
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii题目:给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: prices = [7,1,5,3,6,4]输出: .原创 2021-07-24 16:43:09 · 156 阅读 · 0 评论 -
[LeetCode C++] 283. 移动零
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/move-zeroes解法:双指针class Solution {public: void moveZeroes(vector<int>& nums) { int n=nums.size(), left=0, right=0; while(right < n){ if(nums[right]){原创 2021-07-24 20:11:45 · 175 阅读 · 0 评论 -
[LeetCode C++] 242. 有效的字母异位词
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/valid-anagram/题目:方法一:排序class Solution {public: bool isAnagram(string s, string t) { if (s.length() != t.length()) { return false; } sort(s.begin(), s.end());原创 2021-07-25 10:33:51 · 147 阅读 · 0 评论 -
[LeetCode C++] 80. 删除有序数组中的重复项 II
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/题目:方法一:双指针class Solution {public: int removeDuplicates(vector<int>& nums) { int n = nums.size(); if (n <= 2) { retu原创 2021-07-25 22:04:00 · 359 阅读 · 0 评论 -
[LeetCode C++] 724. 寻找数组的中心下标
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-pivot-index/题目:解法:class Solution {public: int pivotIndex(vector<int> &nums) { int total = accumulate(nums.begin(), nums.end(), 0); int sum = 0; for (int i原创 2021-07-29 14:58:21 · 386 阅读 · 0 评论 -
LeetCode:[剑指 Offer 09. 用两个栈实现队列](C++实现)
文章目录1. 题目说明2. 我的写法3. 官方写法1. 题目说明剑指 Offer 09. 用两个栈实现队列 - 力扣(LeetCode) (leetcode-cn.com)2. 我的写法class CQueue {public: CQueue() { } void appendTail(int value) { stack1.push(value); } int deleteHead() { if(stack2.emp原创 2021-03-23 09:14:43 · 144 阅读 · 0 评论 -
[LeetCode C++] 217. 存在重复元素
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/contains-duplicate题目:方法一:排序class Solution {public: bool containsDuplicate(vector<int>& nums) { sort(nums.begin(), nums.end()); int n = nums.size(); for(int i=0; i原创 2021-07-24 17:15:17 · 238 阅读 · 0 评论 -
[LeetCode C++] 21. 合并两个有序链表
来源:力扣(LeetCode)链接:题目:方法一:递归/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, List原创 2021-07-25 17:37:48 · 304 阅读 · 0 评论 -
[LeetCode C++] 206. 反转链表
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-linked-list/题目:方法一:迭代class Solution {public: ListNode* reverseList(ListNode* head) { ListNode* prev = nullptr; ListNode* curr = head; while (curr) { Li原创 2021-07-25 17:01:48 · 500 阅读 · 1 评论 -
[LeetCode C++] 27. 移除元素
来源:力扣(LeetCode)链接:题目:方法一:双指针class Solution {public: int removeElement(vector<int>& nums, int val) { int n = nums.size(); int left = 0; for (int right = 0; right < n; right++) { if (nums[right] != v原创 2021-07-25 22:00:50 · 283 阅读 · 0 评论 -
[LeetCode C++] 2. 两数相加
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/add-two-numbers/题目:解法:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x)原创 2021-07-31 16:50:26 · 425 阅读 · 0 评论 -
[LeetCode C++] 35. 搜索插入位置
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/search-insert-position/题目:方法一:二分查找class Solution {public: int searchInsert(vector<int>& nums, int target) { int l=0; int r=nums.size()-1; while(l<=r){原创 2021-07-29 15:15:00 · 296 阅读 · 0 评论 -
[LeetCode C++] 66.加一
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/plus-one题目:解法:class Solution {public: vector<int> plusOne(vector<int>& digits) { for (int i = digits.size() - 1; i >= 0; --i) { ++digits[i]; dig原创 2021-07-24 20:02:53 · 173 阅读 · 0 评论