<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[zmingyang的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/zmingyang</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zmingyang]]></copyright><item><title><![CDATA[最长回文子串]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107441720</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107441720</guid><author>zmingyang</author><pubDate>Sun, 19 Jul 2020 10:43:44 +0800</pubDate><description><![CDATA[题目：
给定一个字符串 s，找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1：
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
思路：
本题使用动态规划的思路来做，设字符串为S，我们首先找出S所有的回文子串。设二维布尔数组dp[][]，dp[i][j]表示从字符串S位置i到j构成的子串是否为回文子串。其具体条件如下：
1.当s[i]!=s[j]，此时不属于回文子串
2.当s[i]==s[j]，此时该子串是否是回文子串就需考虑里面的字符，（1）]]></description><category></category></item><item><title><![CDATA[寻找两个正序数组的中位数]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107441195</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107441195</guid><author>zmingyang</author><pubDate>Sun, 19 Jul 2020 10:02:37 +0800</pubDate><description><![CDATA[题目：
给定两个大小为 m 和 n 的正序（从小到大）数组 nums1 和 nums2。
请你找出这两个正序数组的中位数，并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
思路：
因为两数组都是正序的，利用这一点就可以合并成一个正序数组，最后即可求取中位数。
class Solution {
    public double findMedianSorted]]></description><category></category></item><item><title><![CDATA[无重复字符的最长子串]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107440765</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107440765</guid><author>zmingyang</author><pubDate>Sun, 19 Jul 2020 09:37:36 +0800</pubDate><description><![CDATA[题目：
给定一个字符串，请你找出其中不含有重复字符的最长子串的长度。
例：
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”，所以其长度为 3。
思路：
使用一个滑动窗口来遍历整个字符串，使用一个数组列表arrayList来储存当前遍历到的最长不重复子字符串。
当遍历到第i个字符s时，
1.若之前遍历到的字符中不包含s,则将s加入arrayList
2.若之前遍历到的字符中已包括字符s，则（1）保存当前arrayList的尺寸，并与当前最大尺寸相比，若大于则更新最大尺]]></description><category></category></item><item><title><![CDATA[链表中倒数第k个节点--剑指offer（JAVA）]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107259720</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107259720</guid><author>zmingyang</author><pubDate>Fri, 10 Jul 2020 18:26:11 +0800</pubDate><description><![CDATA[题目：
输入一个链表，输出该链表中倒数第k 个结点。为了符合大多数人的习惯，本题从1 开始计数，即链表的尾结点是倒数第1 个结点．例如一个链表有6 个结点，从头结点开始它们的值依次是1 、2、3、4、5 、6。这个链表的倒数第3 个结点是值为4 的结点。
思路：
由于链表没有从后往前的指针，因此直接的想法是将每个链表值储存在某些数据结构中，但这样需要额外的空间。或者把指针遍历两边，第一遍记录总节点数，从而计算出倒数第K个节点正数应该在第几个，然后第二遍找到目标节点。这样的时间复杂度为O（n2），因为需要遍历]]></description><category></category></item><item><title><![CDATA[调整数组顺序使奇数位于偶数前面--剑指offer（JAVA）]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107257848</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107257848</guid><author>zmingyang</author><pubDate>Fri, 10 Jul 2020 17:46:58 +0800</pubDate><description><![CDATA[题目：
输入一个整数数组，实现一个函数来调整该数组中数字的顺序，使得所有奇数位于数组的前半部分，所有偶数位于数组的后半部分。
思路：
设置两个指针，一个指向开头设为i并从前往后遍历，一个指向结尾设为j并从后往前遍历。当i读到当前数为奇数时，i继续往后走，当读到偶数时则停下。j从后往前遍历，同理。当两指针都停下，则交换数字。最终当i&gt;=j时，循环结束。
public class Solution {

    public  void ReorderOddEven(int[] array){
     ]]></description><category></category></item><item><title><![CDATA[表示数值的字符串--剑指offer（JAVA）]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107256495</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107256495</guid><author>zmingyang</author><pubDate>Fri, 10 Jul 2020 17:33:56 +0800</pubDate><description><![CDATA[题目：
请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。例如，字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”±5”和”12e+4.3”都不是。
思路：
对字符进行逐个遍历，如果遇到不符条件就立刻终止返回false。若全部符合则最终返回true
首先对特殊字符进行处理
1.e、E     1）不能出现两次 2）不能是字符串末尾
2. ‘+’,’-’     1）其位置要么在开头要么在e或E后 2）后]]></description><category></category></item><item><title><![CDATA[正则表达式匹配--LeetCode]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107251658</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107251658</guid><author>zmingyang</author><pubDate>Fri, 10 Jul 2020 15:21:52 +0800</pubDate><description><![CDATA[题目：
请实现一个函数用来匹配包括’.’和’’的正则表达式。模式中的字符’.’表示任意一个字符，而’’表示它前面的字符可以出现任意次（包含0次）。 在本题中，匹配是指字符串的所有字符匹配整个模式。例如，字符串”aaa”与模式”a.a”和”abaca”匹配，但是与”aa.a”和”aba”均不匹配
思路：
'.‘的匹配比较简单不说了。’'字符的规则是该字符前的字符可以无限次，因此我们采用从后向前的顺序来匹配。
public class Solution {
    public boolean match(St]]></description><category></category></item><item><title><![CDATA[删除链表的节点--剑指Offer（JAVA）]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107246579</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107246579</guid><author>zmingyang</author><pubDate>Fri, 10 Jul 2020 11:27:04 +0800</pubDate><description><![CDATA[题目1：在O(1)时间内删除链表节点
给定单向链表的头指针和一个节点指针，定义一个函数在O(1)时间内删除该节点。
思路：
如果直接从头节点遍历，找到待删节点n的上一节点，然后将上一节点的下节点设为n的下节点，即可删除n，但此方法时间复杂度为O(n)。
实际上，完成该操作不一定需要节点n的上一节点，我们把n的下一节点的值赋给n，再将n的下一节点设为下下节点即可。需要考虑的特殊情况是n不存在下一节点，此时就只能遍历了。
public class Solution {
	//l1为头结点,l2为待删节点
   ]]></description><category></category></item><item><title><![CDATA[打印从1到最大的n位数--剑指offer（JAVA）]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107244384</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107244384</guid><author>zmingyang</author><pubDate>Fri, 10 Jul 2020 10:22:17 +0800</pubDate><description><![CDATA[题目：
输入数字n，按顺序打印出从1到最大的n位十进制数。比如输入3，则打印出1,2,3一直到最大的3位数999.
思路：
因为没有指定n的范围，因此直接对数字进行打印，不管是int型还是long型都有可能会溢出。因此我们使用数组来完成。
基于此，有不基于递归的方法1和基于递归的方法2。
方法1中，设置好用于存放数字的数组后，需要设置数组加一，以及进位的方法。
方法2中，直接实现对于每位数字从1到9的打印，需要留意的是当前正在对哪一位数字进行操作，因此每次递归需要一个值进行判断。
两种方法都需要打印函数，该]]></description><category></category></item><item><title><![CDATA[数值的整数次方--剑指offer（JAVA）]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107223815</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107223815</guid><author>zmingyang</author><pubDate>Thu, 09 Jul 2020 11:07:39 +0800</pubDate><description><![CDATA[题目：
实现函数double Power(double base, int exponent)，求base的exponent次方。不得使用库函数，同事不需要考虑最大数问题。
思路：
本题的关键在于考虑问题要全面。由于要考虑整数次方，就要考虑指数为负，为0，为正的情况，同时结合base是否为0的情况。
当指数为负，底数（base）为0时，就会出现对0做除法，报错。最后，对算法再进行优化，减少乘法次数。
public class Solution {

    public  double Power(doub]]></description><category></category></item><item><title><![CDATA[二进制中1的个数--剑指offer（JAVA）]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107221817</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107221817</guid><author>zmingyang</author><pubDate>Thu, 09 Jul 2020 10:15:45 +0800</pubDate><description><![CDATA[题目：
请实现一个函数，输入一个整数，输出该整数二进制表示中1的个数。
例，输入9,9的二进制表示为1001，因此输出2.
思路：
本题很明显要使用到位运算，将该数字n的二进制的每一位与1相与，那么要么这个n不断右移，要么数字1不断左移。因为考虑到负数右移会强制把最高位位置1，在该题目中间就会引起错误，因此采用第二种左移的方法。
public class Solution {
    private  int NumberOf1(int n) {
        int count = 0;
       ]]></description><category></category></item><item><title><![CDATA[剪绳子--剑指offer（JAVA）]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107221261</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107221261</guid><author>zmingyang</author><pubDate>Thu, 09 Jul 2020 09:56:00 +0800</pubDate><description><![CDATA[题目：
给你一根长度为n的绳子，请把绳子剪成整数长的m段（m、n都是整数，n&gt;1并且m&gt;1，m&lt;=n），每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少？例如，当绳子的长度是8时，我们把它剪成长度分别为2、3、3的三段，此时得到的最大乘积是18。
思路：
使用递归会有很多重复计算，因此最好从下往上计算，使用动态规划法解题。建立数组res[ ]用来存放结果。当长度为0~3时，其结果对应相等。因为2,3越切越小。当长度大于4时，结果等于max(f(i)*]]></description><category></category></item><item><title><![CDATA[矩阵中的路径--剑指offer（JAVA）]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107201077</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107201077</guid><author>zmingyang</author><pubDate>Wed, 08 Jul 2020 11:08:32 +0800</pubDate><description><![CDATA[请设计一个函数，用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始，每一步可以在矩阵中向左，向右，向上，向下移动一个格子。如果一条路径经过了矩阵中的某一个格子，则之后不能再次进入这个格子。 例如
a b t g
c f c s
j d e h
这样的3 X 4 矩阵中包含一条字符串"bfce"的路径，但是矩阵中不包含"abfb"路径，因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后，路径不能再次进入该格子。
思路：
本题可使用回溯法解决。定义一个与矩阵等]]></description><category></category></item><item><title><![CDATA[旋转数组的最小数字--剑指offer]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107178073</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107178073</guid><author>zmingyang</author><pubDate>Tue, 07 Jul 2020 11:48:40 +0800</pubDate><description><![CDATA[题目：
把一个数组最开始的若干个元素搬到数组的末尾，我们称之为数组的旋转。输入一个递增排序的数组的一个旋转，输出旋转数组的最小元素。例如，数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转，该数组的最小值为1.
思路：
最直观的思路是直接遍历一遍。但这种思路没有用到旋转数组的特性。 我们可以把旋转数组看成两个递增数组，例如上文的{3,4,5}，和{1,2}。因此通过判断中间数字属于第一个递增数组或者第二个递增数组，即可实现二分法。
具体思路如下:
1.使用两个指针分别指向数组的第一个元素和最后一个]]></description><category></category></item><item><title><![CDATA[斐波那切数列--剑指offer]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107176087</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107176087</guid><author>zmingyang</author><pubDate>Tue, 07 Jul 2020 10:40:13 +0800</pubDate><description><![CDATA[题目：
写一个函数，输入n，求斐波那切数列的第n项。斐波那切数列的定义如下
0                  n=0
f(n)      =   1                   n=1
f(n-1)+ f(n-2)   n&gt;1
思路：
直接进行递归会出现大量的重复计算，效率很低。因此使用循环的方法解决。
public class Solution {
    public static long Fibonacci(int n){
        if (n&lt;=0) return 0]]></description><category></category></item><item><title><![CDATA[两个栈实现队列，两个队列实现栈]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107175446</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107175446</guid><author>zmingyang</author><pubDate>Tue, 07 Jul 2020 10:25:09 +0800</pubDate><description><![CDATA[题目：
1.使用两个栈实现一个队列。实现队列的两个函数，入队和出队。
2.使用两个队列实现一个栈，实现栈的入栈出栈。
思路：
使用辅助，用题目1举例，使用栈1和栈2实现。
入队操作：
1.先将栈1所有元素放到栈2，
2.将新元素放入栈1
3.将栈2元素放回栈1
这样，新元素就在栈1的底部。
出队操作：
直接将栈1栈顶元素出栈即可。
题目二同理
import java.util.Stack;
/* 使用两个栈 完成一个队列*/
public class aQueen {

    public aQueen(]]></description><category></category></item><item><title><![CDATA[数组中重复的数字]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107151330</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107151330</guid><author>zmingyang</author><pubDate>Mon, 06 Jul 2020 10:37:12 +0800</pubDate><description><![CDATA[题目：
在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的，但不知道有几个数字重复了，也不知道每个数字重复了多少次。请找出数组中任意一个重复的数字。
例：
如果输入长度为7的数组{2,3，1,0，2,5，3}，那么对应的输出是重复的数字2或3.
思路：
本题可以用多种方法解决
1.遍历数组，预存上一个数字tmp，若tmp等于当前数字则返回当前数字，否则更改tmp的值即可。这种方法的时间复杂度为O(nlogn)
2.使用哈希表来解决，每扫描一个数字就判断一下是否在哈希表中。如果已存]]></description><category></category></item><item><title><![CDATA[整数拆分--动态规划法]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/107057978</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/107057978</guid><author>zmingyang</author><pubDate>Wed, 01 Jul 2020 10:48:26 +0800</pubDate><description><![CDATA[题目：
将正整数n无序拆分成最大数为m的拆分方案个数，要求所有拆分方案不重复。
例如
n = 5, m = 5,对应的拆分方案如下：
5 = 5
5 = 4 + 1
5 = 3 + 2
5 = 3 + 1 + 1
5 = 2 + 2 + 1
5 = 2 + 1 + 1 + 1
5 = 1 + 1 + 1 + 1 + 1
思路：
由例题可知，顺序不影响结果，我们采用动态规划法来解决问题。建立数组dp[n+1][m+1].其中dp[i][j]指正整数i被拆分为最多j个数字的方案数。注意不是一定要拆为j个而是拆为]]></description><category></category></item><item><title><![CDATA[两数相加--LeetCode]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/106989429</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/106989429</guid><author>zmingyang</author><pubDate>Sat, 27 Jun 2020 22:44:35 +0800</pubDate><description><![CDATA[题目：
给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
示例：
输入：(2 -&gt; 4 -&gt; 3) + (5 -&gt; 6 -&gt; 4)
输出：7 -&gt; 0 -&gt; 8
原因：342 + 465 = 807
思路：
本题使用栈来解决，先将两数组数字输入栈，此时注意栈大小要相]]></description><category></category></item><item><title><![CDATA[两数之和--LeetCode]]></title><link>https://blog.youkuaiyun.com/zmingyang/article/details/106989367</link><guid>https://blog.youkuaiyun.com/zmingyang/article/details/106989367</guid><author>zmingyang</author><pubDate>Sat, 27 Jun 2020 22:38:06 +0800</pubDate><description><![CDATA[题目：
给定一个整数数组 nums 和一个目标值 target，请你在该数组中找出和为目标值的那 两个 整数，并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是，数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9。 因为 nums[0] + nums[1] = 2 + 7 = 9。所以返回 [0, 1]
思路：
首先使用先后指针找到目标两个数字，因为要返回原序号并且先后指针的方法需要排序。所以事先对原数组进行复制，之后利用目标元素找]]></description><category></category></item></channel></rss>