
算法与数据结构
1. 基础知识
2. 题解
Live and learn 6688
OMTM:1 meaningful blog every workday╰(*°▽°*)╯
展开
-
JZ36 两个链表的第一个公共结点
题目描述 输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)题解 公共节点:两个链表从某一节点开始,他们的next都指向同一个节点。但由于是单向链表的节点,每个节点只有一个next,因此从第一个公共节点开始,之后他们的所有节点都是重合的,不可能再出现分叉。下图中第一个公共结点为8。方法一:双指针思路: 遍历两遍这两个链表,如果有重复的节点,那么一定能够使遍历的指针相等。遍历两遍这两个链表,相当于连接原创 2021-05-12 15:50:20 · 116 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串
题目描述字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = “abcdefg”, k = 2输出: “cdefgab”示例 2:输入: s = “lrloseumgh”, k = 6输出: “umghlrlose”限制:1 <= k < s.length <= 10000难度: 简单原创 2021-04-30 15:16:07 · 209 阅读 · 1 评论 -
剑指 Offer 40. 最小的k个数
题目描述输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 1:输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]示例 2:输入:arr = [0,1,2,1], k = 1输出:[0]限制:0 <= k <= arr.length <= 100000 <= arr[i] <= 10000题解方法一: 排序Array.Sor原创 2021-04-28 17:01:01 · 79 阅读 · 0 评论 -
剑指 Offer 64. 求1+2+…+n
题目描述求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。示例 1:输入: n = 3输出: 6示例 2:输入: n = 9输出: 45限制:1 <= n <= 10000题解方法一: 求和公式 + 位运算f(n)= n + (n-1) +(n-2) + 1 = (n² + n)/2;C#:public class Solution { public int SumN原创 2021-04-28 16:14:32 · 94 阅读 · 0 评论 -
有效的括号
题目描述给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = “()”输出:true示例 2:输入:s = “()[]{}”输出:true示例 3:输入:s = “(]”输出:false示例 4:输入:s = “([)]”输出:false示例 5:输入:s = “{[]}”输出:true提示:原创 2021-04-25 18:07:00 · 76 阅读 · 0 评论 -
剑指 Offer. 翻转单词顺序
题目描述描述翻转字符串题解方法一:字符串逆序,单词逆序。步骤:把字符串整体逆序, 得到 “tneduts. a ma I”;每个单词逆序,“tneduts” => “student”。方法二:Split(’ '),逆序输出代码using System;class Solution{ public string ReverseSentence(string str) { if(string.IsNullOrWhiteSpace(str))原创 2021-04-24 10:32:27 · 97 阅读 · 0 评论 -
快速排序
步骤:选取基准值(pivot);将数组分成两个子数组:小于pivot => 右子数组;大于pivot =>左子数组;对左右两个数组进行快速排序(递归)。static void QuickSort(int[] dataArray, int left, int right){ if (left < right) { //基准数, 把比它小或者等于它的 放在它的左边,然后把比它大的放在它的右边 int x = dataArray[原创 2021-04-22 21:23:13 · 84 阅读 · 0 评论 -
剑指 Offer 61. 扑克牌中的顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现原创 2021-04-20 16:34:10 · 96 阅读 · 0 评论 -
剑指 Offer 24. 反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。示例1输入:{1,2,3}返回值:{3,2,1}题解此题想考察的是:如何调整链表指针,来达到反转链表的目的。初始化:3个指针1)pre指针指向已经反转好的链表的最后一个节点,最开始没有反转,所以指向nullptr2)cur指针指向待反转链表的第一个节点,最开始第一个节点待反转,所以指向head3)nex指针指向待反转链表的第二个节点,目的是保存链表,因为cur改变指向后,后面的链表则失效了,所以需要保存接下来,循环执行以下三个操原创 2021-04-21 22:27:35 · 174 阅读 · 0 评论 -
JZ11 二进制中1的个数
题目描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。示例1输入:10返回值:2题解知识点:二进制,位运算难度:一星方法一:暴力方法分析:题目给一个有符号的整数int,求整数转化成二进制数后,统计1的个数。直接根据题目的描述来提出方法一。有2个问题:问题1: 如何从十进制数转化到二进制数?问题2:转化为二进制数后,如果判断有1的个数?方法1:除2取模法。方法 二:技巧法思路利用一个结论:一个二进制数n减1后与原二进制数进行&运算( 即n原创 2021-03-23 16:47:26 · 147 阅读 · 0 评论 -
递归
递归:函数调用自己。递归只是让解决方案更清晰,并没有性能上的优势。如果使用循环,程序的性能可能更高。如果使用递归,程序可能更容易理解。每个递归函数都有两部分:递归条件:函数调用自己基线条件:函数不再调用自己,从而避免无线循环。...原创 2021-04-21 20:35:38 · 79 阅读 · 0 评论 -
剑指 Offer 10- II. 青蛙跳台阶问题
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。描述此题和斐波拉契数列做法一样。考察知识:递归,记忆化搜索,动态规划和动态规划的空间优化。难度:一星题解方法一:递归题目分析,假设f[i]表示在第i个台阶上可能的方法数。逆向思维:如果我从第n个台阶进行下台阶,下一步有2种可能,一种走到第n-1个台阶,一种是走到第n-2个台阶。所以f[n] = f[n-1] + f[n-2]。初始条件:f[0] = f[1]原创 2021-03-25 15:53:48 · 72 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。示例1输入:1,2返回值:3描述这是一篇针对初学者的题解知识点:位运算难度:二星题解题目描述:不使用加减乘除来实现两数加法、方法一:位运算知识补充:按位与&,按位或|, 按位异或^。补码计算机中存整数n是用补码存的。如果n为正数,则原码=反码=补码如果n为负数,则补码=反码+1本题是考察对位运算的运用,使用位运算来实现两数的加法。设两数字的二进制形式 a,原创 2021-04-18 16:06:28 · 145 阅读 · 0 评论 -
选择排序
private static void SelectionSort(int[] list) { //每一次循环完成后得到的当前的最大元素都与第i位做交换 for (int i = 0; i < list.Length - 1; i++) { int min_index = i; //list中最小值的索引 for (int j = i + 1; j ...原创 2021-04-19 23:06:25 · 76 阅读 · 0 评论 -
JZ9 变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。示例1输入: 3返回值:4描述这是一道可以递归,记忆化递归,动态规划,递推思想的题目。知识点:递归,动态规划,递推难度:一星题解方法一: f(n) = 2*f(n-1)f(n)=f(n-1)+f(n-2)+……f(1)f(n-1)=f(n-2)+……f(1)则:f(n) - f(n-1) = f(n-1) => f(n) = 2*f(n-1)cl原创 2021-04-13 14:13:06 · 112 阅读 · 0 评论 -
冒泡排序
public static int[] popSort(int arr[]) { for (int i = 0; i < arr.Length - 1; i++) { for (int j = 0; j < arr.Length - 1 - i; j++) { if (arr[j] > arr[j + 1]) ...原创 2021-04-19 22:40:13 · 75 阅读 · 0 评论 -
二分查找(折半查找)
递归public static int BinarySearch(int[] arr, int low, int high, int key){ int mid = (low + high) / 2; if (low > high) { return -1; } if (arr[mid] == key) { return mid; } else if (arr[mid] > key) {原创 2021-04-19 22:23:17 · 69 阅读 · 0 评论 -
剑指 Offer 62.圆圈中最后剩下的数(孩子们的游戏)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!_)。请你试着想下,哪个小朋友会得原创 2021-04-18 17:32:34 · 156 阅读 · 0 评论 -
JZ49 把字符串转换成整数
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0输入描述: 输入一个字符串,包括数字字母符号,可以为空返回值描述: 如果是合法的数值表达则返回该数字,否则返回0示例1输入:"+2147483647"返回值:2147483647示例2输入: “1a33”返回值:0描述这是一篇针对初学者的题解。题解针对atoi()的实现,不限于本题。知识点:字符串,边界考察难度:二星题解方法一:int.Try原创 2021-04-15 22:50:49 · 84 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任一一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1示例1输入:[2,3,1,0,2,5,3]返回值:2或3题解方法一:HashSet.Contains(T) 方法代码using System;using System.Collections.Ge原创 2021-04-14 11:11:19 · 108 阅读 · 0 评论 -
JZ12 数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0。不得使用库函数,同时不需要考虑大数问题,也不用考虑小数点后面0的位数。示例1输入: 2.00000,3返回值: 8.00000示例2输入: 2.10000,3返回值: 9.26100示例3输入: 2.00000,-2返回值: 0.25000说明: 2的-2次方等于1/4=0.25负指数幂:当幂的指数为负数时,称为“原创 2021-04-13 16:50:45 · 79 阅读 · 0 评论 -
JZ10 矩形覆盖
题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:示例1输入:4输出:5描述这是一道规律题。知识点:递归,记忆递归,动态规划,递推难度::一星题解涂掉最后一级矩阵的时候,可以选择使用横向完成,也可以使用竖向完成,横向涂剩下 n - 1 阶,竖向涂剩下 n - 2 阶。关注 n - 1 与 n - 2 时的涂法有几种,这就是斐波那契数列思想:和跳台原创 2021-04-13 16:25:23 · 100 阅读 · 0 评论 -
JZ58 对称的二叉树
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。-示例1//输入{8,6,6,5,7,7,5}// 返回值true示例2//输入{8,6,9,5,7,7,5}// 返回值{8,6,9,5,7,7,5}题解思路一 把输入的树看成两个数,一个遍历左子树,另一个表来遍历右子树,然后逐一比较遍历结果。C#:class Solution{ pu原创 2021-03-09 16:52:28 · 137 阅读 · 1 评论 -
JZ66 机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?示例1输入: 5,10,10返回值: 21 class Solution { /// <summary>原创 2021-03-15 10:49:46 · 235 阅读 · 0 评论 -
JZ67 剪绳子
题目描述给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。输入描述:输入一个数n,意义见题面。(2 <= n <= 60)返回值描述:输出答案。示例1输入:8返回值:18题解class Solution {原创 2021-03-15 17:45:08 · 106 阅读 · 0 评论 -
JZ5 用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。描述这是一道对栈和队列之间灵活转化的题目。难度:一星考察知识:队列,栈题解方法:模拟用两个栈能把顺序反过来实现类似队列的操作。栈的特点:先进后出(FILO)队的特点: 先进先出(FIFO)具体过程:创建一个栈 stackPush,作为压入栈;创建一个栈 stackPop,作为弹出栈;push操作就直接往 stackPush 中 push, 需先判断 stackPush 是否为原创 2021-03-23 11:06:57 · 146 阅读 · 0 评论 -
JZ30 连续子数组的最大和
题目描述输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).示例1输入:[1,-2,3,10,-4,7,2,-5]返回值:18说明:输入的数组为{1,-2,3,10,—4,7,2,一5},和最大的子数组为{3,10,一4,7,2},因此输出为该子数组的和 18。描述这是一篇针对初学者的题解,共用两种方法解决。知识点:数组,动态规划难度:一星题解题目抽象:给定一个数组,求连续子数组的原创 2021-03-22 16:36:25 · 85 阅读 · 0 评论 -
JZ22 从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。示例1输入:{5,4,#,3,#,2,#,1}返回值:[5,4,3,2,1]描述这是一篇指针初学者的题解。知识点:二叉树,队列,树的层次遍历难度:一星题解题目抽象:给出一颗二叉树,按照从上到下,从左到右的顺序遍历节点。也就是从上到下一层一层的遍历。方法:层次遍历这道题就是一个模板题,对队列的使用。因为要满足先进先出的特性。初始化:一个队列queue<TreeNode*> q, 将root节点入队列q原创 2021-03-17 14:29:41 · 78 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。示例1输入:{1,3,5},{2,4,6}返回值:{1,2,3,4,5,6}描述这是一篇针对初学者的题解,共用2种方法解决。知识点:单链表,递归难度:一星题解:题目要求:给两个非递减单链表l1, l2,合并为一个非递减的单链表。方法一:迭代版本求解将两个链表结点挨个进行比较,插入到一个新表中。初始化:定义cur指向新链表的头结点操作:如果 pHead1 指向的结点原创 2021-03-29 17:45:13 · 108 阅读 · 0 评论 -
JZ13 调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。示例1输入:[1,2,3,4]返回值:[1,3,2,4]题解方法一:建立一个链表resultList,读取数组两遍第一遍,只按顺序添加奇数到resultList里,第二遍,只按顺序添加偶数到resultList里输出链表选取链表的原因: 链表不需要事先知道长度大小,所以用链表比数组方便。 using Sy原创 2021-03-24 15:07:19 · 262 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。示例1输入: {67,0,24,58}返回值: [58,24,0,67]描述这是一道对单链表遍历的入门算法题。但是,我将运用三种方法来解决此题。从而达到学一题等于学三题的目的。题目难度:一星考察点:单链表,递归,反转链表题解方法一:使用std::reverse()函数看到题目的第一反应,无非是将单链表遍历一下,(然后思索了几秒,单链表遍历,如何写呢)123while (head) {head = hea原创 2021-03-30 09:26:15 · 121 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例1输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]返回值:true题目难度:二星考察点:数组,二分查找简要说明:这是一道对二维数组进行二分查找的算法,考察对二分查找的灵活运用。方法1: 暴力算法分析:直接遍历一遍数组,即可判断目标原创 2021-03-16 17:51:41 · 108 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。示例1输入:“We Are Happy”返回值:“We%20Are%20Happy”方法一:遍历字符串using System;using System.Collections.Generic;class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定原创 2021-03-29 18:07:48 · 77 阅读 · 0 评论 -
树和二叉树【待补充】
树的基本概念度结点的度:树的度:结点的位置叶子结点:分支结点:内部节点:结点间的相互关系父结点:子结点:兄弟结点:树的分层层次数的结点数和度数的关系:树的结点数 = 所有结点的总度数 +1树的遍历前序遍历后序遍历中序遍历层次遍历...原创 2021-01-06 08:04:48 · 89 阅读 · 0 评论 -
1.1 线性表
基本数据结构补充:Hsah属于散列存储结构线性表按存储结构划分:1. 顺序表: 连续的存储空间。2. 链表: 离散的存储空间,逻辑上是连续的。3. 链表的区别单链表循环链表双链表相关博客: 顺序表与链表4. 链表的操作单链表的节点删除单链表的节点插入5. 顺序表与链表的比较补充:链式存储密度<1, 是因为链式存储还有指针。...原创 2020-12-06 15:37:46 · 139 阅读 · 0 评论 -
数据结构与算法
基本数据结构补充:Hsah属于散列存储结构目录1.1 线性表原创 2020-12-06 15:44:37 · 72 阅读 · 0 评论