<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Sljya的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Sljya</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Sljya]]></copyright><item><title><![CDATA[（快速排序）]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120775151</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120775151</guid><author>Sljya</author><pubDate>Thu, 14 Oct 2021 23:59:19 +0800</pubDate><description><![CDATA[快速排序
思想：

先在数据中找一个基准数据 ： 找待排序数据序列的第一个， 随机数， 三位数取中
将数据按照基准数据分成两部分，前一段都比基准小，后一段都比基准大。
按照同样的思想分别处理前一段和后一段数据。
思考的两个问题：
(1)处理一段数据时，什么样的情况就认为这一段数据已经完全有序
(2) 如何将数据按照基准分成两部分
按照一个基准数据，将待排序数据段分成两部分
数据段为low到high之间的数据。先将基准数据(low位置)保存到tmp中，i=low，j = high。 在i&lt;j的时候，重复]]></description><category></category></item><item><title><![CDATA[（剑指offer）最小的k个数]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120734609</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120734609</guid><author>Sljya</author><pubDate>Tue, 12 Oct 2021 23:38:03 +0800</pubDate><description><![CDATA[最小的k个数
题目描述：输入整数数组 arr ，找出其中最小的 k 个数。
例如，输入4、5、1、6、2、7、3、8这8个数字，则最小的4个数字是1、2、3、4。
示例：
输入：arr=[1,2,5,6,7,89,9,10],k=3
输出：[1,2,5]或[5,2,1]
思路：将原数组排序，用新数组来存储k小的数。
 vector&lt;int&gt; getLeastNumbers(vector&lt;int&gt;&amp; arr, int k) {
        vector&lt;int&gt;]]></description><category></category></item><item><title><![CDATA[（剑指offer）扑克牌中的顺子]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120734311</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120734311</guid><author>Sljya</author><pubDate>Tue, 12 Oct 2021 23:16:26 +0800</pubDate><description><![CDATA[扑克牌中的顺子
题目描述：从若干副扑克牌中随机抽 5 张牌，判断是不是一个顺子，即这5张牌是不是连续的。2～10为数字本身，A为1，J为11，Q为12，K为13，而大、小王为 0 ，可以看成任意数字。A 不能视为 14。
示例1：
输入：[1，2，3，4，5]
输出：true
示例2：
输入：[1，2，2，3，4]
输出：false
思路：
1.先将数组排序。
2.判重。 排序数组中的相同元素位置相邻，因此可通过遍历数组，判断 nums[i] = nums[i + 1] 是否成立来判重。
3.排序后，找到最]]></description><category></category></item><item><title><![CDATA[数组和链表的区别]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120729538</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120729538</guid><author>Sljya</author><pubDate>Tue, 12 Oct 2021 19:27:06 +0800</pubDate><description><![CDATA[数组和链表的区别以及各自的优缺点
1.数组和链表的区别：
（1）数组的元素个数是固定的，而链表的结点个数可按需要增减。
（2)数组元素的存储单元在定义时分配，链表节点的存储单元在执行时动态向系统申请。
（3）数组的元素顺序关系由元素在数组中的位置（即下标）确定，链表中的节点关系由节点所包含的指针来体现。
（4）对于不是固定长度的列表，用可能最大长度的数组来描述，会浪费许多的存储空间。
（5）对于元素的插入、删除操作非常频繁的列表处理场合，用数组表示列表也不是不合适。若用链表实现，会使程序结构清晰，处理的方法]]></description><category></category></item><item><title><![CDATA[（剑指offer）合并两个排序的链表]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120578516</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120578516</guid><author>Sljya</author><pubDate>Fri, 01 Oct 2021 16:19:55 +0800</pubDate><description><![CDATA[合并两个排序的链表
题目描述：输入两个递增排序的链表，合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1：
输入：1-&gt;2-&gt;4, 1-&gt;3-&gt;4
输出：1-&gt;1-&gt;2-&gt;3-&gt;4-&gt;4
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
{
	if (l1 == nullptr) return l2;
	if (l2 == nullptr) return l1;
	ListNode* l3 =]]></description><category></category></item><item><title><![CDATA[（剑指offer）链表中倒数第k个节点]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120578266</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120578266</guid><author>Sljya</author><pubDate>Fri, 01 Oct 2021 15:44:56 +0800</pubDate><description><![CDATA[链表中倒数第k个节点
题目描述：
输入一个链表，输出该链表中倒数第k个节点。为了符合大多数人的习惯，本题从1开始计数，即链表的尾节点是倒数第1个节点。
例如，一个链表有 6 个节点，从头节点开始，它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
示例：给定一个链表: 1-&gt;2-&gt;3-&gt;4-&gt;5, 和 k = 2.返回链表 4-&gt;5.
思路：最简单直接的方法即为顺序查找，假设当前链表的长度为 n，则我们知道链表的倒数第 k个节点即为正数第 ]]></description><category></category></item><item><title><![CDATA[（剑指offer)删除链表的节点]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120578114</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120578114</guid><author>Sljya</author><pubDate>Fri, 01 Oct 2021 15:40:39 +0800</pubDate><description><![CDATA[删除链表的节点
题目描述：给定单向链表的头指针和一个要删除的节点的值，定义一个函数删除该节点。返回删除后的链表的头节点。
思想：本题是删除val值，分为两步：定位节点和修改引用。
1.定位节点：遍历链表，直到找到head-&gt;val==val值时跳出，即可找到目标节点。
2.修改引用： 设节点 cur 的前驱节点为 pre ，后继节点为 cur.next ；则执行 pre.next = cur.next ，即可实现删除 cur 节点。

算法流程：
特例处理： 当应删除头节点 head 时，直接返回 h]]></description><category></category></item><item><title><![CDATA[（剑指offer） 股票的最大利润]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120492709</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120492709</guid><author>Sljya</author><pubDate>Sun, 26 Sep 2021 17:09:22 +0800</pubDate><description><![CDATA[股票的最大利润
题目描述：假设把某股票的价格按照时间先后顺序存储在数组中，请问买卖该股票一次可能获得的最大利润是多少？
思路：我们需要找出给定数组中两个数字之间的最大差值（即，最大利润）。此外，第二个数字（卖出价格）必须大于第一个数字（买入价格）。
形式上，对于每组 i和 j（其中 j &gt; i）我们需要找出 max(prices[j] - prices[i])。
1.暴力法：
int maxProfit(vector&lt;int&gt;&amp; prices) {
        int n = ]]></description><category></category></item><item><title><![CDATA[(剑指offer）青蛙跳台阶问题]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120491663</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120491663</guid><author>Sljya</author><pubDate>Sun, 26 Sep 2021 16:31:40 +0800</pubDate><description><![CDATA[青蛙跳台阶问题
题目描述：一只青蛙一次可以跳上1级台阶，也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
思路：设跳上 nn 级台阶有 f(n)f(n) 种跳法。在所有跳法中，青蛙的最后一步只有两种情况： 跳上 1级或 2级台阶。
当为 1级台阶： 剩 n-1个台阶，此情况共有 f(n-1)种跳法；
当为 2级台阶： 剩 n-2个台阶，此情况共有 f(n-2)种跳法。
f(n)f(n) 为以上两种情况之和，即 f(n)=f(n-1)+f(n-2)，以上递推性质为斐波那契数列。本题可转化为]]></description><category></category></item><item><title><![CDATA[（剑指offer)对称的二叉树]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120490857</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120490857</guid><author>Sljya</author><pubDate>Sun, 26 Sep 2021 16:10:13 +0800</pubDate><description><![CDATA[对称的二叉树
题目描述：请实现一个函数，用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样，那么它是对称的。
例如，二叉树 [1,2,2,3,4,4,3] 是对称的。

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

bool isSymmetric(TreeNode* root) {
	//如果是空树
	if (!root) {
		return true;
	}
	return Helper(root-&gt;left, root-&gt;right);
}
/]]></description><category></category></item><item><title><![CDATA[（剑指offer）树的镜像]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120489715</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120489715</guid><author>Sljya</author><pubDate>Sun, 26 Sep 2021 15:26:15 +0800</pubDate><description><![CDATA[树的镜像
题目描述：请完成一个函数，输入一个二叉树，该函数输出它的镜像。
输入例如：

镜像输出：

思路：我们从根节点开始，递归地对树进行遍历，并从叶子节点先开始翻转得到镜像。如果当前遍历到的节点root 的左右两棵子树都已经翻转得到镜像，那么我们只需要交换两棵子树的位置，即可得到以 root 为根节点的整棵子树的镜像。
代码如下：
TreeNode* mirrorTree(TreeNode* root) {
	if (root == nullptr) {
		return nullptr;
	}
	Tr]]></description><category></category></item><item><title><![CDATA[（剑指offer）树的子结构]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120488727</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120488727</guid><author>Sljya</author><pubDate>Sun, 26 Sep 2021 15:00:38 +0800</pubDate><description><![CDATA[树的子结构
题目描述：输入两棵二叉树A和B，判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构， 即 A中有出现和B相同的结构和节点值。
例如：
给定的树A：

给定的树B：
返回 true，因为 B 与 A 的一个子树拥有相同的结构和节点值。
思路：若树 B 是树 A 的子结构，则子结构的根节点可能为树 AA 的任意一个节点。因此，判断树 B是否是树 A 的子结构，需完成以下两步工作：
1.先序遍历树 A中的每个节点 ;（对应函数 isSubStructure(A, B)）
2.判]]></description><category></category></item><item><title><![CDATA[（剑指 Offer）旋转数组的最小数字]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120441301</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120441301</guid><author>Sljya</author><pubDate>Thu, 23 Sep 2021 19:14:35 +0800</pubDate><description><![CDATA[旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾，我们称之为数组的旋转。输入一个递增排序的数组的一个旋转，输出旋转数组的最小元素。例如，数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转，该数组的最小值为1。
思想：找到第一个变小的元素，如果找不到就是第一个。
 int minArray(vector&lt;int&gt;&amp; numbers) {
        int tmp=numbers[0];
        for(int i=0;i&lt;numbers.]]></description><category></category></item><item><title><![CDATA[（剑指offer）第一个只出现一次的字符]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120441235</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120441235</guid><author>Sljya</author><pubDate>Thu, 23 Sep 2021 19:06:58 +0800</pubDate><description><![CDATA[第一个只出现一次的字符
题目描述：在字符串 s 中找出第一个只出现一次的字符。如果没有，返回一个单空格。 s 只包含小写字母。
思想：我们可以对字符串进行两次遍历。
在第一次遍历时，我们使用哈希映射统计出字符串中每个字符出现的次数。在第二次遍历时，我们只要遍历到了一个只出现一次的字符，那么就返回该字符，否则在遍历结束后返回空格。
 char firstUniqChar(string s) {
    unordered_map&lt;int, int&gt; frequency;
        for (]]></description><category></category></item><item><title><![CDATA[（剑指offer）0～n-1中缺失的数字]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120424531</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120424531</guid><author>Sljya</author><pubDate>Wed, 22 Sep 2021 22:40:21 +0800</pubDate><description><![CDATA[0～n-1中缺失的数字
题目描写：一个长度为n-1的递增排序数组中的所有数字都是唯一的，并且每个数字都在范围0～n-1之内。在范围0～n-1内的n个数字中有且只有一个数字不在该数组中，请找出这个数字。
思想：遍历数组即可。
int missingNumber(vector&lt;int&gt;&amp; nums) {
       for(int i=0;i&lt;nums.size();++i)
       {
           if(nums[i]!=i)
           {
      ]]></description><category></category></item><item><title><![CDATA[（剑指offer）在排序数组中查找数字 I]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120424413</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120424413</guid><author>Sljya</author><pubDate>Wed, 22 Sep 2021 22:29:18 +0800</pubDate><description><![CDATA[在排序数组中查找数字 I
题目描述：统计一个数字在排序数组中出现的次数。
思想：遍历数组，利用tmp记录与target相等的数组，记录一次tmp+1；
  int search(vector&lt;int&gt;&amp; nums, int target) {
        int i=0;
        int tmp=0;
       for(;i&lt;nums.size();++i)
       {
           if(nums[i]==target)
           {
 ]]></description><category></category></item><item><title><![CDATA[（剑指offer）数组中重复的数字]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120422495</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120422495</guid><author>Sljya</author><pubDate>Wed, 22 Sep 2021 21:33:42 +0800</pubDate><description><![CDATA[数组中重复的数字
题目描述：找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0～n-1 的范围内。数组中某些数字是重复的，但不知道有几个数字重复了，也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
思想：在一个长度为 n 的数组 nums 里的所有数字都在 0 ~ n-1 的范围内 。 此说明含义：数组元素的 索引 和 值 是 一对多 的关系。因此，可遍历数组并通过交换操作，使元素的 索引 与 值 一一对应（即 nums[i] = inums[i]=i ）。因而，就]]></description><category></category></item><item><title><![CDATA[(剑指offer)左旋转字符串]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120403187</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120403187</guid><author>Sljya</author><pubDate>Tue, 21 Sep 2021 17:08:16 +0800</pubDate><description><![CDATA[左旋转字符串
题目描述：字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如，输入字符串"abcdefg"和数字2，该函数将返回左旋转两位得到的结果"cdefgab"。
思想：使用substr (俗称：字符截取函数)
函数格式 ：
　　格式1： substr(string string, int a, int b);
　　格式2：substr(string string, int a) ;
　　将字符串倍增成为两个同样的字符串拼接的长字符串然后想旋转]]></description><category></category></item><item><title><![CDATA[（力扣）反转链表]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120393385</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120393385</guid><author>Sljya</author><pubDate>Mon, 20 Sep 2021 18:02:34 +0800</pubDate><description><![CDATA[反转链表
题目描述：定义一个函数，输入一个链表的头节点，反转该链表并输出反转后链表的头节点。
方法1：利用栈来实现
ListNode* reverseList(ListNode* head)
{
	stack&lt;int&gt; st;
	ListNode* p = head;
	while (p != nullptr)
	{
		st.push(p-&gt;val);
		p = p-&gt;next;
	}
	p = head;
	while (p != nullptr)
	{
		p-&gt;val]]></description><category></category></item><item><title><![CDATA[从尾打印链表]]></title><link>https://blog.youkuaiyun.com/Sljya/article/details/120392285</link><guid>https://blog.youkuaiyun.com/Sljya/article/details/120392285</guid><author>Sljya</author><pubDate>Mon, 20 Sep 2021 16:10:13 +0800</pubDate><description><![CDATA[从尾打印链表
题目描述：输入一个链表的头节点，从尾到头反过来返回每个节点的值（用数组返回）。
思路：栈的特点是后进先出，即最后压入栈的元素最先弹出。考虑到栈的这一特点，使用栈将链表元素顺序倒置。从链表的头节点开始，依次将每个节点压入栈内，然后依次弹出栈内的元素并存储到数组中。
非递归
class Solution {
public:
	vector&lt;int&gt; reversePrint(ListNode* head) {
		if (!head)  return {};    
		stack&l]]></description><category></category></item></channel></rss>