![](https://img-blog.csdnimg.cn/20200522223622682.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
常见数据结构与算法,大厂面试题总结
筱寒小记
爱编程、爱生活,计算机专业奋进男青年,立志成为时代翻涌的后浪,分享学习之路所思所得,主要方向为计算机视觉算法、机器学习、数据科学等。
展开
-
LeeCode最优题解收录:74. 搜索二维矩阵
class Solution {public: //题解1:暴力法 bool searchMatrix_1(vector<vector<int>>& matrix, int target) { if(matrix.empty()||matrix[0].empty())return false; for(const auto& m:matrix) { if(find(m.be...原创 2021-03-30 12:11:43 · 92 阅读 · 0 评论 -
LeeCode最优题解收录:94. 二叉树的中序遍历
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}...原创 2021-03-28 09:41:23 · 125 阅读 · 0 评论 -
LeeCode最优题解收录:83. 删除排序链表中的重复元素
/** * 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, ListNode *next) : val(x), next(nex..原创 2021-03-26 15:33:35 · 100 阅读 · 0 评论 -
单链表指定结点的前插与后插(C/C++)
typedef struct LNode{ int data; struct LNode* next;}LNode, *LinkList; //这里LNode 和 *LinkList 等价,只不过LNode更强调一个结点,LinkList更强调一个链表。//指定结点的后插操作:在p结点之后插入元素ebool InsertNextNode(LNode *p,int e){ if(p == NULL) return false; LNode *s = (原创 2021-03-04 13:48:53 · 1944 阅读 · 3 评论 -
数据结构(三)线性表之单链表
一、链表的定义和的特点线性表的链式存储又称单链表,它是通过一组任意的存储单元来存储线性表中的数据元素。每个链表结点,除存放元素自身的信息外,还需要存放一个指向其后继的指针。头结点和头指针的区分:不管带不带头结点,头指针都始终指向链表的第一个结点,而头结点是带头结点的链表中的第一个结点,头结点内通常不存储信息。头结点的优点:1. 由于第一个数据结点的位置被存放在头结点的指针域中,因此在链表的第一个位置上的操作和在表的其他位置上的操作一致,无须进行特殊处理。2. 无论链表是否为空,其头指针都指向头结点原创 2021-03-02 17:50:10 · 211 阅读 · 0 评论 -
LeetCode最优题解 67. 转置矩阵
class Solution {public: vector<vector<int>> transpose(vector<vector<int>>& matrix) { int M = matrix.size(); int N = matrix[0].size(); vector<vector<int>> res(N, vector<int>(M, 0));.原创 2021-03-02 16:54:12 · 162 阅读 · 0 评论 -
顺序表的动态分配实现
#include<cstdlib>#include <cstdio>#define InitSize 10 //默认的最大长度typedef struct{ int *data; //指示动态分配数组的指针 int MaxSize; //顺序表的最大容量 int length; //顺序表的当前长度}SeqList;void InitList(SeqList &L);void IncreaseSize(SeqList &L,原创 2021-02-27 17:14:29 · 210 阅读 · 0 评论 -
数据结构(二)线性表之顺序表
一、顺序表的定义和特点顺序表是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。特点为表中元素的逻辑顺序与物理顺序相同。插入和删除操作需要移动大量元素。线性表中的任一数据元素都可以随机存取。通过首地址和元素序号可在时间O(1)内找到指定元素。线性表中的元素的位序是从1开始的,而数组中的元素的下标是从0开始的。一维数组可以是静态分配的,也可以是动态分配的。二、顺序表的基本操作结构体声明#define MaxSize 50 //线性表的最原创 2021-02-19 14:49:17 · 367 阅读 · 0 评论 -
数据结构(一) 绪论
数据结构绪论一、知识框架二、基本概念和术语数据数据元素数据对象数据类型数据结构三、数据结构三要素1. 数据的逻辑结构2. 数据的存储结构3. 数据的运算一、知识框架二、基本概念和术语数据数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。数据元素数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。例如,学生记录就是一个原创 2021-02-08 21:49:20 · 124 阅读 · 0 评论 -
常用字符串处理函数收录(C++)
1. 整数转string字符串( to_string() )函数原型:string to_string (int val);string to_string (long val);string to_string (long long val);string to_string (unsigned val);string to_string (unsigned long val);string to_string (unsigned long long val);string to_st原创 2020-11-24 21:26:46 · 183 阅读 · 0 评论 -
LeeCode最优题解收录:709. 转换成小写字母(C++)(大小写转换——位运算)
题目:题解:class Solution {public: string toLowerCase(string str) { /* 正常思路 int change_num='a'-'A'; string res=""; for(auto s:str) { if(s>='A'&&s<='Z') res+=(s+change_num); el原创 2020-11-24 12:51:57 · 130 阅读 · 0 评论 -
LeeCode最优题解收录:1588.所有奇数长度子数组的和(C++)
题解如下://以{1,2,3,4,5}为例,计算i为某确定值时候对应arr[i]出现的总次数。public int sumOddLengthSubarrays(int[] arr) { int sum = 0; int len = arr.length; for (int i = 0; i < arr.length; i++) { //当i = 2时候,arr[2] = 3,左边有2个元素1,2, //需要保证连续,则取元素方式如下:...原创 2020-11-21 11:21:39 · 196 阅读 · 0 评论 -
斯特拉森矩阵乘法意义及启示
斯特拉森矩阵乘法斯特拉森矩阵算法的时间复杂度为O(n的2.81次方)启示:斯特拉森算法启示:即使是由定义出发所直接给出的明显算法——并非总是最好的。虽然斯特拉森矩阵乘法目前还只具有理论意义,但其可能为获得更有效和在计算机上切实可行的算法奠定了基础。参考文章:https://blog.csdn.net/qq_43410618/article/details/104837912...原创 2020-11-17 20:54:01 · 664 阅读 · 0 评论 -
如何理解算法的空间复杂度?
如何理解算法的空间复杂度?一般我们不太喜欢谈空间复杂度,评价算法效率的时候还是以时间复杂度作为主要指标的。方便理解的话你可以把这三个部分想象成:输入数据的规模,编译链接后生成的可执行程序的大小,运行这个程序的过程中监控到的占用内存最大大小。一般我们谈及空间复杂度也更倾向于第三个部分,尤其是各类主要考验算法设计的OJ,输入是固定的,程序大小主要也依赖于编译/语言等底层实现,能由高级的,可以被抽象为函数的算法优化的只有在实现算法过程中使用的额外辅助空间的大小了,比如排序算法,有些可以在原地实现,那么空间复转载 2020-11-17 20:27:20 · 366 阅读 · 0 评论 -
LeeCode最优题解收录:9.回文数(Java)
题目:解题思路:代码:class Solution { public boolean isPalindrome(int x) { //负数肯定不是回文数,再者末位为0的数只有0是回文数 if( x<0 || (x%10==0 && x!=0) ) { return false; } int temp = 0; while(x>temp)原创 2020-06-06 16:49:43 · 184 阅读 · 0 评论 -
LeeCode最优题解收录:7.整数反转(Java)
代码:class Solution { public int reverse(int x) { //这里用long放溢出 long res = 0; while(x!=0) { res = res*10 + x%10; x = x/10; } //这里处理了结果比int范围大问题 return ((int)res == res) ? (int).原创 2020-06-06 15:54:33 · 169 阅读 · 0 评论 -
算法小组第三次交流会代码
算法小组第三次交流会代码包含第三章全部例题及部分习题代码,并用c++改写程序 3-1 逆序输出(有输入问题)比较大的数组应该尽量声明在main函数外,否则程序可能无法运行。#include<stdio.h>//#include<cstdio>using namespace std;const int maxn=105;int a[maxn];int ...原创 2020-06-04 20:08:51 · 182 阅读 · 0 评论 -
LeeCode最优题解收录:1.两数之和(Java)
题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9。因为 nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1]最优题解:一遍哈希class Solution { public int[] twoSum(int[] num原创 2020-06-04 12:48:46 · 314 阅读 · 0 评论 -
数据结构与算法之冒泡排序(Java实现)
今天我们来说说:冒泡排序冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。算法描述1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个;2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;3. 针对所有的元素重复以上的步骤,除了最.原创 2020-05-30 19:14:55 · 210 阅读 · 0 评论 -
c++头文件<algorithm>小结
algorithm是c++特有的STL模板的算法头文件 包含了一些特定的算法函数1、for_eachfor_each(容器起始地址,容器结束地址,要执行的方法)#include <iostream>#include <algorithm>#include <vector>using namespace std;void printElem(int...原创 2019-12-20 10:21:17 · 274 阅读 · 0 评论 -
数据结构之循环队列(c语言)
#include <stdio.h>#include <stdlib.h>struct Queue{ int *data; int capacity; int front; int rear;};void init(struct Queue *pq,int capacity){ pq->capacity=capac...原创 2019-11-14 20:10:26 · 187 阅读 · 0 评论 -
数据结构之顺序栈的实现(C++)
#include <iostream>#include <stack>using namespace std;int main(){ stack<int> st; //创建栈 st.push(11); //压栈 st.push(22); int x; x=st.top(); //获得栈顶元素 st.po...原创 2019-11-14 10:54:35 · 192 阅读 · 0 评论 -
数据结构之顺序栈的实现(c语言)
#include<stdio.h>#include<stdlib.h>struct Stack{ int *data; int capacity; int top;};void init(struct Stack *ps,int capacity){ ps->capacity=capacity; ps->da...原创 2019-11-14 10:45:35 · 141 阅读 · 0 评论 -
线性表顺序存储和链式存储比较
一、顺序存储 :1、相邻数据元素的存放地址也相邻(逻辑与物理统一),2、要求内存中可用的存储单元的地址必须是连续的。优点:1、存储密度大(=1),存储空间利用率高。2、方法简单,各种高级语言中都有数组,容易实现。3、不用为表示节点间的逻辑关系而增加额外的存储开销。4、顺序表具有按元素序号随机访问的特点。缺点:1、在顺序表中做插入、删除操作时,平均移动表中的一半元素,因此对n较大的...原创 2019-11-13 18:19:23 · 1937 阅读 · 0 评论 -
十大经典排序算法(转载)
作者非常形象生动的讲述了经典的十大排序算法:Link 点击查看原文转载 2019-11-13 16:25:02 · 98 阅读 · 0 评论 -
数据结构之快速排序(C++)
快速排序一、目的掌握快速排序的算法。二、内容排序是计算机领域的一项重要技术,是程序设计中的一种重要运算。它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。学习和研究各种排序方法,是计算机工作者的一项重要工作课题。冒泡排序想来大家都很熟悉,它是一种想法很自然的排序方法。快速排序是对冒泡排序的一种改进。它的基本思想是,通过一趟排序将待排记录分割成独立的两个部分。其中,一部...原创 2019-11-13 16:04:25 · 318 阅读 · 0 评论 -
数据结构之中序线索二叉树(C++)
中序线索二叉树一、 目的:理解线索的含义,掌握线索二叉树的算法。了解中序线索及其遍历的实现过程。二、内容:通过学习同学知道,遍历二叉树是以一定的规则,将二叉树中的结点排列成一个线性序列,得到二叉树的先序序列、中序序列、或者后序序列。这实质是将一个非线性结构进行线性化操作。但是,当以二叉链表作为存储结构时,只能找到左右孩子的信息,而不能找到任意的结点的前驱信息和后继信息。这种信息只能在...原创 2019-11-13 16:02:03 · 910 阅读 · 0 评论 -
数据结构之有序表的实现(c语言)
有序表的建立、插入与删除一、目的1 了解有序表的顺序存储结构。2 掌握有序表元素在内存中是怎样存储的。3 在有序表中实现如下操作:(1)插入一个新元素到第i个位置,使原来标号为增1;(2)删除第i个位置的元素;(3)存一个新元素到第i个位置;(4)读表;(5)检索表中第i个元素;(6)寻表的长度。二、原理线性表是最常用的而且也是最简单的一种数据结构,线性表是N个数据元素的有...原创 2019-11-13 16:00:00 · 1926 阅读 · 0 评论 -
数据结构之单链表的实现(c语言)
#include<stdio.h>#include<stdlib.h>struct Node{ int data; struct Node* next;};// 可以使用typedef简化操作:// typedef struct Node* LList;/* 两种链表实现 head pointer(头指针,变化) | [ ...原创 2019-11-13 15:50:36 · 332 阅读 · 0 评论 -
数据结构的几种基础实现
数据结构的几种基础实现数据结构是计算机专业的一门重要的基础课,它的教学要求大致有三个重要方面:第一就是让学生学会分析研究计算机加工的数据对象的特性,确定数据的逻辑结构和适当的物理结构;第二,根据结构,设计适当的算法,并初步掌握算法的时间分析和空间分析;第三,学习复杂的程序设计。实验一、有序表的建立、插入与删除一、实验目的1 了解有序表的顺序存储结构。2 掌握有序表元素在内存中是怎样存储的...原创 2020-05-30 00:37:58 · 1089 阅读 · 0 评论