乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group 一.前言 将一个链表按照一定的长度切成几部分,然后每部分进行翻转以后再拼接成一个链表是比较困难的,但是这也能锻炼我们的思维能力. 二.Reverse Nodes in k-Group 2.1 问题 2.2 分析与解决     最简单的想法,我们可以将链表分成几部分,每一个部分分开考虑,比如使用头插法,正好可以将顺序颠倒一下,或者我们通过某种方式使得顺序发生改变,然后再结合起来. /** * Definiti…
乘风破浪:LeetCode真题_024_Swap Nodes in Pairs 一.前言 这次还是链表的操作,不过我们需要交换链表奇数和偶数位置上的节点,因此要怎么做呢? 二.Swap Nodes in Pairs 2.1 问题      要求是不能修改节点的元素,并且使用的空间也是常数级别的,不能使用更高的内存空间. 2.2 分析与解决      通过分析我们可以使用简单的遍历算法,通过四个指针来解决,当然我们也可以使用递归算法来解答. 使用正常遍历算法: public class Solut…
乘风破浪:LeetCode真题_023_Merge k Sorted Lists 一.前言 上次我们学过了合并两个链表,这次我们要合并N个链表要怎么做呢,最先想到的就是转换成2个链表合并的问题,然后解决,再优化一点的,就是两个两个合并,当然我们也可以一次性比较所有的元素,然后一点点的进行合并等等. 二.Merge k Sorted Lists 2.1 问题 2.2 分析与解决 首先我们看看官方的解法: 第一种方法:暴力算法,将所有的元素放到一个数组里面,排序之后再用指针链接. # Definit…
乘风破浪:LeetCode真题_036_Valid Sudoku 一.前言 有的时候对于一些基础知识的掌握,对我们是至关重要的,比如ASCII重要字符的表示,比如一些基本类型的长度. 二.Valid Sudoku 2.1 问题 2.2 分析与解决 这样的问题可以说是比较简单了,我们只需要简单的按照规则进行检测就能得到相应的结果了,但是有没有更好一点的方法呢?我想应该是没有了. public class Solution { /** * 题目大意 * 验证一个数独棋盘是否合法,数独棋盘的验证规则见…
乘风破浪:LeetCode真题_031_Next Permutation 一.前言 这是一道经典的题目,我们实在想不出最好的方法,只能按照已有的方法来解决,同时我们也应该思考一下为什么要这样做?是怎么想到的?这比我们记住步骤更加的有用. 二.Next Permutation 2.1 问题 2.2 分析与解决 排列(Arrangement),简单讲是从N个不同元素中取出M个,按照一定顺序排成一列,通常用A(M,N)表示.当M=N时,称为全排列(Permutation).从数学角度讲,全排列的个数A…
乘风破浪:LeetCode真题_029_Divide Two Integers 一.前言     两个整数相除,不能使用乘法除法和取余运算.那么就只能想想移位运算和加减法运算了. 二.Divide Two Integers 2.1 问题 2.2 分析与解决      通过分析,我们可以想到,如果使用加法,一次次的减下去,每减一次就加一,直到最后的减数小于除数.但是这样的时间复杂度将会是非常的大,比如100000,3这两个数,非常的耗时,那么如何加快运算呢,我们想到了移位运算. public cl…
乘风破浪:LeetCode真题_028_Implement strStr() 一.前言     这次是字符串匹配问题,找到最开始匹配的位置,并返回. 二.Implement strStr() 2.1 问题     当模式串为空的时候,返回索引0,空字符串也是一个字符串. 2.2 分析与解决     注意到一些细节之后,我们首先想到了用笨办法来解决,其次又想到了KMP算法来匹配,需要求next数组.     笨办法比较: class Solution { public int strStr(Str…
乘风破浪:LeetCode真题_019_Remove Nth Node From End of List 一.前言 这次总算到了链表的操作了,之后肯定会有排序算法,二叉树,排序树,图等等的操作,现在我们先从链表开始. 二.Remove Nth Node From End of List 2.1 问题 2.2 分析与解决 其实这个问题真的不难,只要知道了链表的长度,然后做一个减法就能找到需要移除的节点了,但是题目上说可以在一次遍历之内就完成运算吗?这就有点难度了,我们可能一时想不开,作为单向链表,…
乘风破浪:LeetCode真题_018_4Sum 一.前言 前面我们已经练习过了三个数相加的集合运算,现在变成了四个数,其实道理是一样的.三个数的时候可以转成两个数的加法,最后来解决,而四个数的可以转换成三个数的加法,最终变成两个数的加法运算. 二.4Sum 2.1 问题 2.2 分析与解决     根据我们之前的经验,可以很自然地想到变成三个数相加来计算,不过因为是四个数相加,因此需要至少3个循环了,这样时间复杂度就是O(n~3).下面是这种解法. class Solution { publi…
乘风破浪:LeetCode真题_015_3Sum 一.前言 关于集合的操作,也是编程最容易考试的问题,比如求集和中的3个元素使得它们的和为0,并且要求不重复出现,这样的问题该怎么样解决呢? 二.3Sum 2.1 问题 2.2 分析与解决     遇到这样的问题,我们更应该仔细想想如果使用暴力法的时间效率,可以发现是O(n~3)的时间复杂度,并且会出现重复过的,需要去除重复,这是非常让人难以忍受的,并且我们知道随着集合的增大,这样的代价非常的大.那么我们如何进行优化呢,这里就要仔细的想想如果我们在…