数据结构和算法学习
文章平均质量分 73
柯藤
这个作者很懒,什么都没留下…
展开
-
C++中指针和引用的区别
1、两者定义和性质不同指针是一个变量,存储的是一个地址,指向内存的一个内存单元引用是源变量的一个别名,跟原来的变量实质上是同一个东西int a = 123;int *p = &a; // p是指针, &在此是求地址运算int &r = a; // r是引用, &在此起标识作用2、指针可以有多级,引用只能是一级int **p; // 指针的指针,p是存储指针的地址int &&r; // 不合法3、指针可以在定义的时候不初始化,引用必须在转载 2021-09-19 15:05:45 · 4142 阅读 · 0 评论 -
KMP算法
文章目录KMP算法简介KMP算法实现与代码1 、 以力扣28. 实现 strStr()为例2、算法实现2、1 next表建立2、2 寻找字串位置KMP算法简介在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个字符串S内查找一个词W的出现位置。一个词在不匹配时本身就包含足够的信息来确定下一个匹配可能的开始位置,此算法利用这一特性以避免重新检查先前匹配的字符。(参考维基百科)KMP算法实现与代码1 、 以力扣28. 实现 strStr()为例给你两个字.原创 2021-09-14 15:22:56 · 132 阅读 · 0 评论 -
18.四数之和
文章目录问题描述1、算法以及代码1、1 基本思路1、2 重点1、3 代码1、3 复杂度问题描述给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] :0 <= a, b, c, d < na、b、c 和 d 互不相同nums[a] + nums[b] + nums[c] + nums[d] == target你可以按 任意顺序 返回答案 .原创 2021-09-04 14:31:23 · 84 阅读 · 0 评论 -
递归算法时间复杂度和空间复杂度分析与举例
文章目录前言1、递归算法性能分析公式1.1 时间复杂度计算公式1.2 空间复杂度计算公式1.3 例子1.3.1 暴力算法1.3.2 递归算法1.3.3 优化递归算法总结前言根据代码随想录博主整理的主要是为了记录递归算法如何分析其性能,并如何根据其性能来优化递归算法。1、递归算法性能分析公式1.1 时间复杂度计算公式递归算法的时间复杂度 = 递归的次数 * 每次递归的时间复杂度。1.2 空间复杂度计算公式递归算法的空间复杂度 = 递归的深度 * 每次递归的空间复杂度。1.3 例子计算.原创 2021-08-24 11:42:46 · 10151 阅读 · 4 评论 -
213. 打家劫舍 II
文章目录1、问题描述1、1 示例2、算法描述和代码2、1 算法描述2、2 代码2、3 复杂度分析1、问题描述你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。1、1 示例示例 1:输入:nums =.原创 2021-08-20 10:18:30 · 53 阅读 · 0 评论 -
17. 电话号码的字母组合
文章目录1、问题描述示例:2、算法思路与代码代码如下1、问题描述给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:示例 1:输入:digits = “23”输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]示例 2:输入:digits = “”输出:[]示例 3:输入:digits = “2”输出:[“a”,“b.原创 2021-08-18 14:41:35 · 74 阅读 · 0 评论 -
力扣 47 全排列 II
文章目录1、力扣 47 全排列 II1.1 问题描述1.2 示例2、回溯算法2.1 回溯算法百度定义2.2 算法思路2.3 代码1、力扣 47 全排列 II1.1 问题描述给定一个可包含重复数字的序列 nums ,按任意顺序返回所有不重复的全排列。1.2 示例示例 1:输入:nums = [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]示例 2:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,.原创 2021-08-17 16:41:20 · 145 阅读 · 0 评论 -
图像渲染算法--C++
文章目录1、问题描述1.1 题目要求1.2 示例2、深度优先搜索算法DFS2.1 问题分析2.2 代码2.3 复杂度1、问题描述1.1 题目要求有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的原创 2021-07-28 23:07:23 · 916 阅读 · 0 评论 -
无重复字符的最长字串算法
文章目录1、问题描述1. 问题2. 例子2、暴力算法1. 代码如下2. 复杂度:3、容器--哈希表法1. unordered_map容器介绍[参考来源](http://c.biancheng.net/view/7231.html)2. 代码如下3. 复杂度:总结1、问题描述1. 问题给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。2. 例子示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例原创 2021-07-26 15:42:57 · 323 阅读 · 0 评论 -
链表的中间结点算法
文章目录1、问题描述2、单指针法3、快慢指针法总结1、问题描述给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val = 4, ans.next.next.v原创 2021-07-25 10:27:18 · 199 阅读 · 0 评论 -
字符串反转
文章目录一、问题一描述1、要求:2、例子:二、算法分析与代码1、题目分析2、复杂度分析三、问题二描述四、算法分析和代码五、总结一、问题一描述编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。1、要求:不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1)O(1)O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。2、例子:示例 1:输入:[“h”,“e”,“l”,“l”,“o”]原创 2021-07-24 19:52:19 · 569 阅读 · 0 评论 -
两数之和算法 -- 输入有序数组
问题描述:给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。注1:函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1<=answer[0]<answer[1]<=numbers.length1 <= answer[0] < answer[1] <= numbers.length1<=answer[0]<answ原创 2021-07-24 09:11:17 · 179 阅读 · 0 评论 -
移动零算法--双指针
文章目录问题描述一、算法分析与代码问题描述给定一个数组 numsnumsnums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]一、算法分析与代码在一个数组numsnumsnums中,将所有零元素移至数组尾部,并且保持原数组非零元素相对位置。要想移动零元素,那么必须要找到数组中的零元素nums[left]nums[left]nums[left],这需要一个判断语句来判别,并且需要一个指针leftl原创 2021-07-22 17:41:59 · 108 阅读 · 0 评论 -
旋转数组算法
问题描述:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。进阶:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?例子:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]输入:nums = [-1,-100,3,99], k = 2输出:[3,99,-1,-100]算法分析与实现:题目分析:将数组nums[n]nums[n原创 2021-07-21 22:02:04 · 109 阅读 · 0 评论 -
有序数组平方排序
有序数组平方排序主要用来练习排序算法。问题描述:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例:输入:nums = [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]算法分析:方案一:直接平方后,再进行排序class Solution{public: vector<int> sort翻译 2021-07-08 17:41:04 · 540 阅读 · 0 评论 -
二分查找算法
二分查找:问题描述:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。@Override public void run() { bytes = mmInStream.read(buffer); mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTar原创 2021-07-03 11:27:16 · 65 阅读 · 0 评论 -
力扣题目——剪绳子
力扣题目——剪绳子前言一、分析二、算法流程1.Java代码2.C++代码总结前言给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。一、分析长度为n的绳子分成k段,每段长度为n1n_1n1,n2n_2n2,…,nkn_knk;翻译 2021-07-03 09:34:53 · 563 阅读 · 0 评论