![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode题解
芋艿ashes
这个作者很懒,什么都没留下…
展开
-
Count and Say
题意:对于一个序列: n = 1时,打印一个1。n = 2时,看n=1那一行,念:1个1,所以打印:11。n = 3时,看n=2那一行,念:2个1,所以打印:21。n = 4时,看n=3那一行,念:一个2一个1,所以打印:1211。以此类推。(注意这里n是从1开始的) 思路:从左到右遍历,若是相邻两个相同的话,count++,看代码吧… 代码:public String CalCount(in原创 2016-10-24 07:43:16 · 189 阅读 · 0 评论 -
Valid Number
题意:就是需要对一个字符串判断是否满足科学计数方法。 思路:科学计数法中只能出现数字0到9、e、E、‘.’、+、-这些字符。因此就是需要判断这些字符出现的条件。 首先:0到9在任何位置出现都是合法的;e或者E必须满足:前面不能有e或者E出现过,而且不能是第一个或者是最后一个出现;’.’出现的条件是:前面不能有小数点出现,而且不能是第一个或者是最后一个出现;+和-出现的条件是:必须在第一位或者在e原创 2016-10-20 23:17:14 · 173 阅读 · 0 评论 -
Longest Common Prefix
题意:对一组字符串,找出这组字符串的最长共同前缀。 思路:首先,找出这组字符串中最短的字符串,最长前缀肯定是小于最短字符串长度的,因此,对每个字符串,从位置0开始,比较是否相同。 代码:public class LongestCommonPrefix { public int MinLength(String[] strs){ int min = strs[0].lengt原创 2016-10-21 09:01:45 · 184 阅读 · 0 评论 -
Integer to Roman
题意:将整数转换为罗马数字 思路:罗马数字表示方式和整数有很大区别,其中, I: 1 IV: 4 V: 5 IX: 9 X: 10 XL: 40 L: 50 XC: 90 C: 100 CD: 400 D: 500 CM: 900 M: 1000。 这是罗马数字的一个组合情况,任意字符出现次数不能超过三次,以数字3978为例,涉及到的还是一个/和%的运算。 s = 3原创 2016-10-21 09:45:56 · 158 阅读 · 0 评论 -
RomanToInteger
题意:将罗马数字转换为int数字。 思路:这道题需要先确定在罗马数字中的基本字符:I V X L C D M。先维护一个HashMap,对于一个连续的罗马数字,从左向右遍历,这里需要注意的是,如果当前字符的下一个字符的值比当前字符大,就需要把把后一个字符的值减去当前字符的值,而且是减两次;否则的话,就在结果中加上当前字符对应的数字。 代码:public class RomanToInteger原创 2016-10-21 10:47:52 · 209 阅读 · 0 评论 -
prlindrome partition ii
题意:给定一个字符串序列,找出序列中的所有回文子串,求找出所有回文子串的最小切割次数。 思路:首先需要设置dp数组变量cuts,对每一个位置,设置cuts[i] = len - i 。再设置一个boolean二维数组,如果是符合回文子串的要求就设置为true。这里涉及到对回文的判定问题,对于一个子串,判定条件有一个先后顺序,需要特别注意。 代码:package PrlindromePartiti原创 2016-11-14 09:39:09 · 197 阅读 · 0 评论 -
Buy and sell stock at best time(i,ii,iii)
题意: i:交易一次,求买入卖出得到的最大利润。 ii:交易无限次,但不能在同一时间进行多次交易。 iii:交易二次,求买入卖出得到的最大利润。 思路: i:只须找出价格序列中的最大最小值。低进高出,最低的一天要在最高的一天之前,贪心解决。 代码:public int ProfitMax(int[] prices){ if(prices == null || prices原创 2016-11-14 16:30:49 · 188 阅读 · 0 评论 -
interleaving String
题意:给定三个序列S1,S2,S3,对于S1,S2和S3比较,看S1、S2是否是和S3间隔排序的,譬如,S1 = “aabcc”,S2=”dbbca”,S3=”aadbbcbcac”,则是满足条件的。 思路:动规。维护数组dp[s1.length][s2.length]。先初始化dp数组,再进行判断。 代码:package com.interLeaving;public class InterL原创 2016-11-15 20:18:39 · 257 阅读 · 0 评论 -
word ladder &word ladder 2
word ladder 题意:给定start和end,一个字典序列,计算从start变成end,利用字典序列里的字符串进行转换,所需要变换次数。 例如,start = hit,end = cog ,dict = [“hot” , “dot” , “dog” , “lot” , “log”]; 思路:使用BFS的遍历思路,对start,对其每一位上的字母从‘a’到‘z’进行替换,若是替换后的字符原创 2016-12-03 09:41:43 · 399 阅读 · 0 评论 -
Surrounded Regions
题意:这道题是说一个O周围都是X那么这个O就得变成X。那么就可以发现四周这一圈如果有O肯定不能四周都被X包围,同时这个O也将会是潜在的内部的O的缺口。 思路:用BFS。对第一行和最后一行,第一列和最后一列进行遍历,若是X,则不作处理直接返回;若是O,则遍历其上下左右的元素,若是有O,则把相邻的O置为#;结束之后,遍历每一个元素,若为#,则说明之前的是O,把#置为O即可;若还是为O,则说明这个O是被原创 2016-12-03 10:09:18 · 188 阅读 · 0 评论 -
Edit Distance
题意:将一个字符串转为另外一个字符串需要的步数,可以插入、删除、替换一个字符,求需要的最少的操作步数。 思路:动规解决。Distance[i][j]记录操作步数。 考虑str1c和str2d,若是c == d,则Distance[i][j] = Distance[i-1][j] +1; 若是在c后面添加一个d,则是Distance[i][j] = Distance[i][j-1] +1; 若原创 2016-11-25 19:10:58 · 214 阅读 · 0 评论 -
decode ways
题意:把A-Z字母按照1-26的顺序对应起来,然后给出一个数字字符串,计算出对应的字母顺序有多少种。如‘12’,对应有AB、L两种。 思路:动规,设置prev,cur两个变量记录。 代码:package com.decodeWays;public class decodeWays { public int calDecodeWays(String s){ int prev原创 2016-11-25 22:10:21 · 203 阅读 · 0 评论 -
restore ip addresses
题意:给定一串数字,返回这串数字能够组成的所有合法ip。 思路:对ip的每一段进行isValid判断,再对每一段的ip,若满足长度为3且通过isValid判断,则返回;否则,对每一段的ip,若当前分割满足isValid,则递归调用dfs,进行下一轮的调用。 代码:package com.RestoreIpAddresses;import java.util.ArrayList;public cl原创 2016-12-09 11:25:35 · 198 阅读 · 0 评论 -
Jump Game
题意:Given an array of non-negative integers, you are initially positioned at the first index of the array.Each element in the array represents your maximum jump length at that position.Determine if you原创 2016-11-27 20:40:45 · 145 阅读 · 0 评论 -
container with most water(12.6)
题意:(i,ai)二维坐标上的一组数组。给出这么一个数组,计算出任意两个数据能够组成的最大的面积。 思路:短板原理。维护两个指针,一前一后,计算面积。 代码:package com.ContainerWithMostWater;public class CalWater { public int calWater(int[] heights) { int low = 0原创 2016-11-28 11:14:57 · 186 阅读 · 0 评论 -
Longest Substring without repeating Characters(12.5)
题意:给定一个字符串,找出最长不重复的子串。 思路1:贪心法。从左往右扫描,当遇到重复字母时,以上一个重复字母的index+1,作为新的搜索起始位置,直至最后一个字母。 思路二:滚动数组法。维护一个hashset,两个指针end和start。记录当前遍历的子串,具体见代码。 代码: package com.LongestSubstring_12_5;import java.util.HashS原创 2016-11-28 11:25:44 · 242 阅读 · 0 评论 -
Add Binary
题意:将两个二进制的数字相加,并且结果也是以二进制的形式输出。 思路:从两个数的低位开始进行相加。两个二进制数的位数可能不一样,首先需要将位数低的那个数进行扩展,和位数高的数一样长。然后按位相加。 代码:package AddBinary;import com.sun.org.apache.xml.internal.security.Init;public class AddBinary {p原创 2016-10-05 14:22:08 · 169 阅读 · 0 评论 -
StringToInteger
题意:将一个数字字符串转换为纯数字 思路:这道题就是需要做一些判断, 不规则输入,空格判断,溢出,正负号判断等。这里字符串处理有一个方法,trim()方法,它可以将字符串首尾的空格去掉。 代码:package StringToInteger;public class StringToInteger { public double Trverse(String s){ if原创 2016-10-05 10:31:23 · 620 阅读 · 0 评论 -
Implement strStr()
题意:在一个字符串中查找是否存在子串和其他的字符串相同 思路:暴力破解 代码:package ImplementStr;public class ImplementStr { public String FindStr(String haystack , String needle){ int m = haystack.length(); int n =原创 2016-10-05 00:44:45 · 209 阅读 · 0 评论 -
Anagrams
题意:找出一组字符串中所有回文的字符串,即由相同的字符组成的字符串。 思路:用一个HashMap存储,对这组字符串中的所有字符串进行一个排序。其中key值存储的是相同的字符串,而value值存储的对应key值的不同字符串。再定义一个result数组,result数组存储由HashMap返回的相同的字符串。 代码:public ArrayList<String> anagrams(String[]原创 2016-10-24 09:48:28 · 191 阅读 · 0 评论 -
Simplify Path
题意:简化路径。 思路:构建两个栈stack和temp。对于一个字符串,遇到“.”或者空的时候,不作处理;遇到“..”的时候,stack就弹出;其他就直接入栈。 输出的时候,先把stack栈出栈,temp再入栈。 代码:public class SimplifyPath { public String Simplify(String path) { if(path =原创 2016-10-24 11:21:58 · 190 阅读 · 0 评论 -
valid Parentheses
题意:括号匹配 思路:栈的使用 代码:public class ValidParentheses { public boolean isValid(String string){ if(string == null || string.length() == 0) return false; Stack<Character> stack = new St原创 2016-10-25 17:01:15 · 163 阅读 · 0 评论 -
Longest Valid Parentheses
题意:找出一个字符串中最长的左右括号匹配长度。 思路:维护一个栈,遇见’(‘,就进栈;否则,如果弹出当前元素,如果当前弹出后栈为空,则说明匹配,维护一个合法的位置start,当前最长匹配就是i-start;如果弹出后栈不为空,最长匹配长度就是当前的i值减去栈顶的元素。 代码:public int CalLongest(String string){ if(string == nu原创 2016-10-25 17:12:03 · 239 阅读 · 0 评论 -
Permutation Sequence
题意:本题是要找出给定(1,n)之间的这么多数,任意组成的序列中,第k大的数来。 思路:利用康托编码,x=an(n-1)!+an-1(n-2)!+an-2(n-3)!+…+a1*0!,那么逆求一个给定的数是第几个数的时候,就可以按这个思路来。例如,给定(1,5),求第16个数是哪个。那么,如下: 16-1=15; 15/4! =0…..15 15/3! = 2….3 3/2! = 1….1原创 2016-09-30 09:31:45 · 171 阅读 · 0 评论 -
valid sudo
题意:数独游戏,9*9的方格中,要求每一行、每一列、每个3*3的小矩阵都没有重复的数字。 思路:可以利用hashset的唯一性来求得。对每一行、每一列、每个3*3矩阵(共9个)进行遍历,看是否有重复的数字。 代码: package ValidSudo;import java.util.HashSet;public class ValidSudo { //利用hashset的唯一性来求原创 2016-09-30 11:03:44 · 217 阅读 · 0 评论 -
Evaluate Reverse Polish Notation
题意:逆波兰表达式求值 思路:利用一个栈,遇到数字就进栈,遇到操作符就从栈里弹出两个数字进行计算,并将计算结果压入栈中。 代码:public int CalNotation(String[] str) { if(str == null || str.length == 0) return -1; Stack<Integer>stack = new Stack<>(原创 2016-10-26 16:22:23 · 178 阅读 · 0 评论 -
Trapping rain water
题意:找出能够容纳的最大容积是多少 思路:首先,定义两个数组left[]和right[],分别记录当前位置的左边和右边的最大高度;先从左至右遍历数组,找出当前位置的左边的最大高度,再从右至左遍历,找出当前位置右边的最大高度;最后遍历数组,能容纳的大小就是min(max_left[i],max_right[i])-height之和。 代码:package TrappingWater;public原创 2016-10-01 11:20:38 · 137 阅读 · 0 评论 -
Plus One
题意:一个整数,例如998,百位、十位、个位上的9、9、8分别存储在数组的2、1、0位;对该数加一,求加一后的整数大小。 思路:从个位数字开始,设置一个temp值监控,当不需要进位时,直接在个位加一;当需要进位时,就进行加一操作, 返回该整数。 代码:package PlusOne;public class PlusOne { public int[] PlusOne(int []di原创 2016-10-02 00:19:08 · 176 阅读 · 0 评论 -
climb stairs
题意:每次能走一步或者两步,求走完一段n步的楼梯有多少种走法。 思路:斐波那契数列 代码: package ClimbStairs;public class ClimbStairs { public int Climb(int n){ if(n==0 || n==1 || n==2) return n; int []arr = new int原创 2016-10-02 00:49:17 · 442 阅读 · 0 评论 -
Gray Code
题意:求n位整数对应的所有格雷码。 思路:利用递归来进行。以n=3为例,对应有000、001、010、011、100、101、110、111八种编码。可以发现规律,这是在n=2的格雷码前分别加上了0和1所得到的。亦即000+(Gray(n = 2))和100+(Gray(n=2)),据此,可以写出代码。 代码:package GrayCode;import java.util.ArrayList原创 2016-10-02 13:37:53 · 163 阅读 · 0 评论 -
set matrix zero
题意:在一个m*n的矩阵中matrix中,若matrix[i][j]==0 ,就将第i行和第j列的元素都设为0; 思路一:遍历,直观解法,设置两个数组,分别记录行和列的boolean值。 代码:package SetMatrixZero;public class SetMatrixZero { public void SetZero(int [][]matrix){原创 2016-10-02 14:32:32 · 335 阅读 · 0 评论 -
Gas Station
题意:在一个环形中,有n个加油站,每个站的油量是gas[i],从i到i+1的加油站需要cost[i]的油量。初始油桶的油量是0,设计能走完一圈的合适路线。 思路:遍历n个加油站,计算gas[i]-cost[i],用sum和total两个值来储存,sum用于判断是否满足条件,total用于计算剩余油量总和。 代码:package GasStation;public int GetIndexOfS原创 2016-10-02 21:34:26 · 351 阅读 · 0 评论 -
Candy
题意:给一列学生糖吃,这列学生各有一个rate,rate越大分到的糖就越多,最少分一颗糖;求一列学生至少的分糖总数。 思路:这题和trapping water类似,都需要从左往右和从右往左进行两次遍历,以从左往右为例,定义数组left[],当前的学生和左边的学生相比较,如果rate值是比左边的学生大的话,那就是left[i]+1,否则就置1; 从右往左类似。 代码:package Candy;原创 2016-10-02 23:10:20 · 145 阅读 · 0 评论 -
ValidPalindrome
题意:判断一个字符串中是否存在回文;英文回文的意思就是一个字符串从前往后和从后往前的字符串是一样的。 思路:直接搞两个index,一个从前往后,一个从后往前,看是否相等。 代码:package ValidPalindrome;public class ValidPalindrome { public boolean IsPalindrome(String s) { if(s.le原创 2016-10-05 00:42:42 · 243 阅读 · 0 评论 -
剑指offer(题六)
题意:给出二叉树前序和中序序列,要求重构该二叉树并输出根节点。 思路:就是由前序和中序确认该二叉树的形状。 代码:package MianShiTi_6;public class MianShiTi_6 { public static class BinaryTreeNode{ int value; BinaryTreeNode left;原创 2017-02-27 20:47:06 · 170 阅读 · 0 评论