
LeetCode
飘来荡去、、
这个作者很懒,什么都没留下…
展开
-
奇偶链表
一开始老是想着交换节点的值,但是这特么是链表又不是数组,直接把奇数位的节点拿出来拼成一条链,偶数位也拼成一条链,然后将后者拼接到前者末尾,搞定。。。。。。。。。。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ...原创 2019-05-10 13:51:28 · 396 阅读 · 1 评论 -
寻求峰值
寻找中间值大于左右值,且时间复杂度为O(logN),想到使用折半查找。折半查找/*折半查找*/int Binary_Search(int a*,int n,int key){ int low,high,mid; low=1; /*定义最底下标为记录首位*/ high=n; /*定义最高下标为记录末位*/ while(low<...原创 2019-01-02 13:49:52 · 275 阅读 · 0 评论 -
乘积最大子序列
最大乘积可以由正数乘正数或者负数乘负数得到,所以在扫描过程中需要记录两个数值,一个最大值(max),一个最小值(min)。如果当前元素大于等于0,那么通过比较max*nums[i]和nums[i]的大小就可以得到到i为止的最大乘积子序列。如果当前元素小于0,通过比较min*nums[i]和nums[i]的大小就可以得到到i为止的最大乘积子序列。所以可以得到状态转移方程为:当n...原创 2019-01-02 12:40:10 · 221 阅读 · 0 评论 -
在排序数组中查找元素的第一个和最后一个位置
数组有序,时间复杂度要求为,使用折半查找。一、查什么?目标值的开始位置和结束位置,普通的折半查找只能判断目标值是否在数组当中,在的话返回其下标,但是这里面的数组有重复值,所以要对折半查找进行改造。二、怎么查?先查目标值的开始位置。如何定义开始位置?如果在数组中找到目标值的位置,然后判断它左边位置上的数是否和目标值相等:如果不相等,那么此时目标值的位置就是开始位置;如果相...原创 2019-01-06 17:52:33 · 1215 阅读 · 2 评论 -
x的平方根
首先开方后的数肯定小于原数的一半,然后在之间进行折半查找,查找某一个数的平方等于x。但是因为int范围的限制,不能做乘法,用除法来判断;如果折半查找完成后任然没有找到,那么返回high位置的数即可。class Solution { public int mySqrt(int x) { if (x == 0 || x == 1){ retur...原创 2019-01-06 14:28:05 · 434 阅读 · 0 评论 -
寻找两个有序数组的中位数
方法一:合并两个数组,然后求中位数,时间复杂度为:O(m+n)class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int length1 = nums1.length; int length2 = nums2.length; ...原创 2019-01-04 13:48:09 · 559 阅读 · 0 评论 -
整数拆分
通过证明可以得到,尽可能多的拆出3,就可以得到乘积最大。 public static int integerBreak2(int n) { if (n <= 3){ return n-1; } int result = 1; while (n > 4 ){ r...原创 2018-12-15 12:53:14 · 222 阅读 · 1 评论 -
三角形最小路径和
动态规划,最后路径和最小,那么每一步必须最小一、求解 求出到达最后一层的所有最小路径,然后再求出其中最小的即可。初始化二维数组用来存放结果final int size = triangle.get(triangle.size() - 1).size();int[][] result = new int[size][size];result[0][0] = triang...原创 2018-12-13 15:17:57 · 169 阅读 · 0 评论 -
单词拆分 II
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。说明:分隔时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。示例 1:输入:s = "catsanddog"wordDict =["cat", "cats", "and", "sand", "dog&qu原创 2018-12-03 16:25:35 · 835 阅读 · 0 评论 -
二维区域和检索 - 矩阵不可变
思路和一维的一样:首先计算result,求出每一行的所有区间和。然后累加【row1,row2】区间内每一行的和。class NumMatrix { private int[][] result; public NumMatrix(int[][] matrix) { int row = matrix.length; if(row ...原创 2018-12-01 23:10:32 · 341 阅读 · 0 评论 -
区域和检索 - 数组不可变
注意需要多次调用sumRange方法,所以不能简单的进行区间遍历求和,动态规划一下,记录一下 每个区间的和,然后根据索引直接求出结果。class NumArray { private int[] sums; public NumArray(int[] nums) { final int length = nums.length; i...原创 2018-12-01 11:23:08 · 254 阅读 · 0 评论 -
打家劫舍 II
在Ⅰ的基础上进行修改,这里面要额外考虑的就是是否偷窃第一个房间和偷窃最后一个房间,所以就分别计算一下两种情况的值,然后取最大值就可以了。偷窃第一个房间: int[] result2 = new int[length]; result2[0] = nums[0]; result2[1] = Math.max(nums[0],nums[1])...原创 2018-11-28 15:35:36 · 191 阅读 · 0 评论 -
单词拆分
动态规划。问题分解:以leetcode为例,判断一个字符串是否可以被分割成一个一个的单词,那么就就可以先判断l和eetcode是否在字典当中,只有前半部分和剩余部分都在字典当中,那么此时字符串才能被分割为单词;如果不在的话那么继续向下扫描,判断le和eetcode分别在字典当中。这里面使用一个辅助数组用来存放当前扫描位置前的判断结果,就是存放l、le等的判断结果,方便下一次判断(记忆搜...原创 2018-11-27 23:35:09 · 558 阅读 · 0 评论 -
搜索二维矩阵
思路:题目已经说的很直接了,每一行都是升序,且每一列也是升序,所以可以使用折半查找。但是不可能对每一行都进行查找,要先定位到target可能在的那一行,然后再对这一行进行折半查找。如何定位?根据数组的最后一列,找到第一个比target值大的数所处的行,那么target极有可能就在这一行。同时如果在最后一列就找到了target值,那么直接返回即可。代码:class Solution {...原创 2019-01-03 14:34:56 · 183 阅读 · 0 评论 -
搜索旋转排序数组
方法还是使用折半查找。一、怎么查?因为折半查找的前提条件是数组必须有序,但是现在数组旋转了,如果可以让数组恢复顺序,那么直接折半查找就可以了。二、怎么恢复?首先想到的是:找到数组的最小值,然后根据数组长度来重新定位low和high,这样就可以满足折半查找的要求。以【4,5,6,7,0,1,2】为例,最小值的下标是4。那么,(7是数组的长度),然后计算;但是还需要判断一下是否...原创 2019-01-08 17:31:14 · 177 阅读 · 0 评论 -
两数相除
思路一不能用除法,那就用乘法,设置一个计数器,然后通过比较与的大小,让计数器累加,不满足条件跳出循环即可。先对除数和被除数进行处理,都取绝对值,最后返回结果的时候再处理,因为题目设置的是整数范围,所以为了确保处理的正确性,使用类型的临时变量。 public static int divide(int dividend, int divisor) { if (di...原创 2019-05-07 13:01:29 · 290 阅读 · 0 评论 -
Pow(x,n)
class Solution { public double myPow(double x, int n) { boolean tag = false; double result = 1; if (n == 0){ return 1d; } if (n < 0){ ...原创 2019-05-09 13:49:18 · 225 阅读 · 0 评论 -
下一个排列
很诡异的题,看了好几遍题没看懂说什么,然后去搜了一下,方法如下:从右往左遍历 找到第一个索引满足:,如果不存在就反转整个数组 再找第二个索引,满足: 交换和 最后从开始反转整个数组class Solution { public void nextPermutation(int[] nums) { int length = nums.length; ...原创 2019-05-09 13:01:26 · 226 阅读 · 0 评论 -
括号生成
方法一:暴力破解生成所有可能的字符串组合,然后检查有效的字符串。一共可以生成的字符串个数为:为了生成所有序列,我们使用递归。长度为n的序列就是'('加上所有长度为n-1的序列,以及')'加上所有长度为n-1的序列。为了检查序列是否为有效的,我们会跟踪平衡,也就是左括号的数量减去右括号的数量的净值。如果这个值始终小于零或者不以零结束,该序列就是无效的,否则它是有效...原创 2019-04-20 14:03:40 · 268 阅读 · 0 评论 -
两两交换链表中的节点
思路采用递归的方式进行求解。先找递归终止的条件:没有交换的时候就递归终止,即当链表只剩一个节点或者没有节点的时候。找返回值:因为是两两交换,所以递归的每一层返回的都是已经交换完成的链表。每层递归要做的事情:每一层可以保存两个节点和,我们要做的事就是交换它两的位置:,那么为了让每一次递归返回的链表连接起来,那么还需要做的是:上一次递归返回的结果。具体执行过程如下代码...原创 2019-04-29 10:33:31 · 370 阅读 · 0 评论 -
Z字形变换
思路:直接模拟Z字变换的过程,将每个字符添加到对应的行即可。用一个计数器来记录当前字符应该添加到哪一行,当时让重新置0即可。在这个过程中要设置一个标记位用来规定方向,一开始是从上到下为每一行中添加字符,当把置0后,那么方向就要改变,换成从下到上,所以通过来控制添加的顺序。package leetcode.problem6;import java.util.ArrayList;i...原创 2019-04-24 13:38:09 · 206 阅读 · 0 评论 -
二叉树的右视图
思路一:对树进行层次遍历(从左往右),保存每层的最后一个节点/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x;...原创 2019-03-01 14:18:58 · 635 阅读 · 0 评论 -
二叉树与链表
一、二叉树转链表思路一:递归版本思路是先利用DFS的思路找到最左子节点,然后回到其父节点,把其父节点和右子节点断开,将原左子结点连上父节点的右子节点上,然后再把原右子节点连到新右子节点的右子节点上,然后再回到上一父节点做相同操作。步骤如下:首先找到最左节点3 1 / \ 2 5 / \ \3 4 6断开父节点2和4的连接 把3连...原创 2019-02-25 13:58:40 · 3180 阅读 · 0 评论 -
被围绕的区域
思路:从边界上的“O”出发进行深度搜索,将图中所有与边界上的“O”连通的“O”(包括边界上的“O”)都用“*”替代,那么图中所有“*”组成的区域其实是无法被“X”包围的,那么图中剩余的“O”就完全被“X”包围了。所以在深度搜索完成后,将图中所有“*”的点用“O”替换,所有“O”的点用“X”替换。代码:class Solution { public void solve(ch...原创 2019-01-21 16:56:18 · 172 阅读 · 0 评论 -
岛屿的个数
思路:如果当前节点为陆地,那么就从该节点开始,按照深度优先遍历,直到遇到0就停止。遍历过程中将1赋值为0,避免重复遍历。通过这样遍历一次,就可以找到一个岛屿了。最后的矩阵中就全部为0了。相当于求连通子图代码:class Solution { public int numIslands(char[][] grid) { int count = 0; ...原创 2019-01-21 15:33:32 · 233 阅读 · 0 评论 -
寻找重复数
折半查找一、如何确定一个数是否重复?因为所有数字都在范围内,那么我们可以判断出重复数字在哪一个范围内。判断方法是:先得到的中间数,然后在中进行搜索,统计小于等于的个数,记为如果,说明重复数字在区间内如果,说明重复数字在区间内最终的重复数字就是。二、代码class Solution { public int findDuplicate(int[] num...原创 2019-01-09 13:07:50 · 511 阅读 · 0 评论 -
0-1背包、完全背包、多重背包、零钱兑换
目录一、0-1背包问题1.1 问题描述1.2 动态规划过程1.3 状态转移方程1.4 填表1.5 代码1.6 回溯法求解1.7 优化二、完全背包问题2.1 问题描述2.2 分析2.3 填表2.4 代码2.5 回溯法求解2.6 优化三、多重背包3.1 问题描述3.2 分析3.3 填表3.4 代码3.5 回溯法求解...原创 2018-12-04 23:25:14 · 941 阅读 · 0 评论 -
删除排序数组中的重复项 II
思路:设置快慢指针k(慢),i(快)和一个计数器,判断相邻的两个数字是否相等,如果相等,则计数器加一,并且判断计数器的值是否超过2,没有超过的话k向后移动一位;如果相邻的两个数字不相等,那么将k向后移动一位,然后将num[i]中的值赋值给nums[k]。关键:k用来保证每个元素最多出现两次。不想等的时候分为两种情况:计数器的值小于2,说明nums[k]的下一个元素就是nums[i] ...原创 2018-11-25 16:05:03 · 169 阅读 · 0 评论 -
爬楼梯
思路:爬到n阶的方法有两种:1. 从n-1阶爬上来2. 从n-2阶直接上来同理到达n-1阶的方法也有两种:从n-2阶上或者从n-3阶上,到达n-2阶的方法也有两种:从n-3阶上或者从n-4阶上………………递归问题,要想求到达n阶的方法数,必须求到达n-1阶和n-2阶的方法数。得到递归方程:f(n)=f(n-1)+f(n-2)那么初始状态为:f(1) = 1,f(2...原创 2019-03-15 21:34:11 · 232 阅读 · 0 评论 -
四数之和
给定一个包含n个整数的数组nums和一个目标值target,判断nums中是否存在四个元素a,b,c和d,使得a+b+c+d的值与target相等?找出所有满足条件且不重复的四元组。思路:与处理三数之和一样,先对nums排序,然后固定前两个数字,在剩余的数字中查询满足条件的数字。代码:public List<List<Integ...原创 2019-03-20 22:41:14 · 179 阅读 · 0 评论 -
三数之和
给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c ,使得a + b + c =0 ?找出所有满足条件且不重复的三元组。思路:首先对数组排序,使用快排。然后用一个for来遍历数组,首先判断该数是否大于0,如果大于0,那么就直接break掉,因为后面的数加起来不可能等于0;如果小于0,首先计算target = 0 - nums[i]的值,然后在[i+...原创 2019-03-20 22:40:14 · 827 阅读 · 0 评论 -
最长回文字串
给定一个字符串s,找到s中最长的回文子串。你可以假设s的最大长度为1000。动态规划代码: //动态规划 public static String longestPalindrome(String s) { final int length = s.length(); int maxLength = 0; i...原创 2019-03-21 21:58:31 · 267 阅读 · 0 评论 -
求不同路径
思路:动态规划重点:问题分解因为只能向右或者向下移动,那么第一行和第一列中的每一格都设为1,其余格的值都等于M【i,j】 = M【i-1,j】+M【i,j-1】代码:public int uniquePaths(int m, int n) { int[][] M = new int[m][n]; for(int i = 0; i < ...原创 2019-03-15 21:22:50 · 174 阅读 · 0 评论 -
最大子序和
设sum[i]为以第i个元素结尾且和最大的连续子数组。假设对于第i个元素,所有以它前面的和已经求得,那么以第i个元素结尾且和最大的连续子数组实际上可以分为两种情况:以第i-1个元素结尾且和最大的连续子数组加上第i个元素 只包含第i个元素状态转移方程为:。可以通过判断sum[i-1] + nums[i]是否大于nums[i]来做选择,而这实际上等价于判断sum[i-1]是否大于0。...原创 2019-01-02 11:08:12 · 177 阅读 · 0 评论 -
删除排序链表中的重复元素
思路:设置快慢指针,两个指针位置相差一,然后比较两个指针所指向的节点内的值,如果相同则删除q所指向的节点,然后p,q移动;如果不相同,那么直接p,q移动即可。转化:用赋值代替删除。当p和q所指向节点的值不相同时,先让p后移一位,然后将q的值赋值给p指向的节点,然后q向后移动一位。当p和q所指向节点的值相同时,q向后移动,一直找到与p不同的节点为止。最后p->next = ...原创 2018-11-25 00:12:04 · 189 阅读 · 0 评论 -
打家劫舍
方法一:暴力法计算到达每一个房间时所能盗窃的最大金额。设当前为第i个房间,那么可以从【0,i-2】中任意一个房间直接到达第i个房间,所以需要在这里面找到最大值。class Solution { public int rob(int[] nums) { int length = nums.length; if (length == 0){ ...原创 2018-11-25 19:37:57 · 195 阅读 · 0 评论 -
买卖股票的最佳时机
方法一:暴力破解 public int maxProfit(int[] prices) { int result = Integer.MIN_VALUE; for (int i = 0; i < prices.length; i++){ for (int j = i+1; j < prices.length; j+...原创 2019-03-21 22:53:38 · 328 阅读 · 0 评论 -
使用最小花费爬楼梯
动态规划问题,在爬楼梯的基础上增加了权值,所以这里面计算的最小路径,而不是路径的条数,整体思路还是一样。设楼梯的阶数为n,也就是cost的长度,T用来保存到达每一阶台阶的花费,那么从1~n-1阶的范围内,可以得出状态转移方程:T[i] = MIN(cost[i] + T[i - 1], cost[i] + T[i - 2])当到达第n阶的时候就需要分情况讨论了:从倒数第二个台...原创 2018-11-23 11:15:35 · 199 阅读 · 0 评论 -
报数
通过get方法来构造字符串,使用快慢指针来进行统计。class Solution { public String countAndSay(int n) { String temp = "1"; if(n == 1) return temp; for (int i = 1; i <n ; i++){ te...原创 2018-11-22 11:58:12 · 177 阅读 · 0 评论 -
不同路径(二)
在一的基础上增加了障碍:思路一样,状态转移方程不变,但是要改变转移的条件。为了便于计算,障碍物赋值-1情况一:边界处理当边界中含有障碍物时,那么障碍物以后的位置都要赋值-1,不可达。情况二:中间当不在边界上时,计算经过每一个位置的路径M【i】【j】时,需要注意,当M【i-1】【j】和M【i】【j-1】都不为-1的时,它两的和才赋值给M【i】【j】;只要它两中有一个为-1...原创 2019-03-15 21:23:58 · 232 阅读 · 0 评论