Leetcode-算法
算法
Alan先生的代码屋
这是一间奇妙的屋子!
展开
-
题目20、有效的括号(Leetcode题解-java实现)
1、题目给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。2、实现代码class Solution { public boolean isValid(String s) { Stack<Character>stack = new Stack<Character>(); fo原创 2021-01-21 15:46:44 · 110 阅读 · 0 评论 -
题目19、删除链表的倒数第N个结点(Leetcode题解-java实现)
1、题目给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?2、代码实现class Solution { int count = 0; public ListNode removeNthFromEnd(ListNode head, int n) { //如果是空的,直接返回(也是递归的出口) if (head == null) return null; //进入递归(递归入口)原创 2021-01-21 15:27:59 · 110 阅读 · 0 评论 -
题目18、四数之和(Leetcode题解-java实现)
1、题目给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。2、实现代码class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { List<原创 2021-01-21 15:05:34 · 191 阅读 · 0 评论 -
题目17、电话号码的字母组合(Leetcode题解-java实现)
1、题目给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。2、实现代码class Solution { public List<String> letterCombinations(String digits) { List<String> result = new ArrayList(); //如果是空字符串或者null直接返回 i原创 2021-01-21 14:22:07 · 103 阅读 · 0 评论 -
题目16、最接近的三数之和(Leetcode题解-java实现)
1、题目给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。2、实现代码主要思想:三个数值,每一轮迭代,先确定一个数,然后往后寻找两个数值。class Solution { public int threeSumClosest(int[] nums, int target) { //先对数组排序 Arrays.sort(num原创 2021-01-21 13:44:16 · 124 阅读 · 0 评论 -
题目15、三数之和(Leetcode题解-java实现)
1、题目给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。2、代码实现核心思想:将条件转化为a+b=(-c),亦是两数之和等于第三个数的负。先对原始数组排序,然后固定一个数c,在数c之后寻找两个数,用两个下标进行运算。class Solution { public List<List<Integer>> thre原创 2021-01-21 13:29:10 · 283 阅读 · 0 评论 -
题目13、罗马数字转整数(Leetcode题解-java实现)
1、题目罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。2、实现代码class Solution { public int romanToInt(String s) { int n = s.length(); int roman_int = 0; for(int i=0;i<n;i++) { //这里对应匹配,正常统一处理 switch(s.charAt(i)) { case 'I' : roman_int原创 2021-01-19 20:36:43 · 66 阅读 · 0 评论 -
题目14、最长公共前缀(leetcodet题解-java实现)
1、题目编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。2、实现代码思路见于注释class Solution { public String longestCommonPrefix(String[] strs) { //如果数组为0,直接返回 if(strs.length==0)return ""; //以提供的字符串组中的第一个串为基准 String s=strs[0];原创 2021-01-19 20:26:58 · 108 阅读 · 0 评论 -
题目12、整数转罗马数字(Leetcode题解-java实现)
1、题目罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。2、实现代码针对特殊情况,进行映射,映射集合从大排到小,检测到数值大于某个元素值,则映射到对应的符号然后加上去。对于普通的数值,比如:3,可以用三个1对应的符号表示;6可以用5和1对应的符号表示;7可以用5和3表示,以此类推。class Solution { public String intToRoman(int num) { int[] value = {1000,900,500,400,1原创 2021-01-19 19:55:44 · 95 阅读 · 0 评论 -
题目11、盛最多水的容器(Leetcode题解-java实现)
1、题目给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。2、实现代码主要实现思想:设置两个首尾下标指针 i 和 j ,比较两者大小,小的说明小的应该“进一步”,如此反复,直到i<j结束,过程中用max变量记录最大值。class Solution { public原创 2021-01-19 19:28:20 · 59 阅读 · 0 评论 -
题目10、正则表达式匹配(Leetcode题解-java实现)
1、题目给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。2、代码解题下面这个解法是评论区比较简洁的写法,但是理解起来比较复杂,需要细细品味。class Solution { public boolean isMatch(String s, String p) { int sLen = s.length(),原创 2021-01-19 18:34:39 · 147 阅读 · 0 评论 -
题目9、回文数(Leetcode题解-java实现)
1、题目判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。(注意:进阶的要求)2、实现代码(版本一)主要思想是数学规律,数字的最高位数字和最低位数字比较,然后次最高位数字和次最低位数字比较,类推下去。比如:输入“1771”,首先最高位1和最低位1比较,然后通过处理,下一轮,次最高位7和次最低位7比较,设一个Boolean标志记录,然后返回。(详细见于下面注释)其实这道题,通过String转char数组是更快的,但是题目进阶的要求是不用String类型,所以有原创 2021-01-16 22:17:05 · 179 阅读 · 0 评论 -
题目8、字符串转换整数(Leetcode题解-java实现)
1、题目请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:2、实现代码其实,这道题主要是针对输入字符串的格式处理,针对题目输入可能出现的格式,进行相应处理,然后提取数值就可以了,但是这里有个算是低级的格式,就是数值都是连续的,不然又是另一种处理,下面是一种实现的代码。(这道题更像是考察程序的健壮性。) class Solution { public int myAtoi(Str原创 2021-01-16 19:49:32 · 236 阅读 · 0 评论 -
题目7、整数反转(Leetcode题解-java实现)
1、题目给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。2、代码实现class Solution { public int reverse(int x) { //这里之所以取long类型,是因为Leetcode有输入值1534236469, //转化后是9646324351,直接返回会超出int类型的取值范围,需要强制转换int类型 long n = 0; while(x != 0) {原创 2021-01-16 19:16:07 · 102 阅读 · 0 评论 -
题目6、Z字形变换(Leetcode题解-java实现)
1、题目将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。2、代码实现核心思想:主要是分层处理思想,通过求余“%”来实现分层,用StringBuilder数组来存储各个层次的元素,最后,分层存储结束后,逐层输出元素。class Solution { public String convert(String s, int numRows) { //如果一行,直接返回 if(numRows <= 1){原创 2021-01-15 20:10:18 · 141 阅读 · 0 评论 -
题目5、最长回文子串(Leetcode题解-java实现)
1、题目给你一个字符串 s,找到 s 中最长的回文子串。2、解题思路我自己的解决思路还是偏向n的2次方时间复杂度,Leetcode上有一个解决方法,是目前见过的最好的! 绝妙!思路如下:1、先找回文子串的“中央轴”,可能是单个,比如“a” ;也可能是多个,比如“aaa”;2、然后以“中央轴”左右扩散,寻找最大的回文子串并记录;3、返回最大的回文子串;(详细见代码注释,绝妙!时间复杂约为n级别。)3、代码(要理解代码,直接将最终回文子串代入代码思考,就可以理解了。)class Solu原创 2021-01-15 16:59:13 · 197 阅读 · 0 评论 -
题目4、寻找两个正序数组的中位数(Leetcode题解-java实现)
1、题目给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?2、输入输出示例3、解题思路题目可以知道,有两个有序数组分别为A 和 B,那么需要解决的步骤如下:1、设计两个下标,A数组的初始下标 a为0;B数组的初试下标b为0;2、比较A[a]与B[b]之间的大小,小的一方下标加一;比如A[0]>B[0],则a++;3、情况2的依次进行,直到比原创 2021-01-15 15:31:45 · 201 阅读 · 0 评论 -
题目3、无重复字符的最长子串(Leetcode题解-java实现)
1、题目要求给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。2、题目分析实现的关键主要以下几点:1、避免暴力解题,就是多个嵌套for循环,要使用单层while循环;2、在1的基础上,需要设立两个变量记录开始和结束下标,主要用于模拟移动;3、需要借助hashmap类来实现部分内容的存储;3、实现代码如下import java.util.ArrayList;class Solution { public int lengthOfLongestSubstring(Str原创 2021-01-11 21:44:16 · 165 阅读 · 0 评论 -
题目2、两数相加(Leetcode题解-java实现)
1、题目要求给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例1:示例2示例3………………………………………………………………………………………………………………………………2、算法思想本题主要是理清楚逻辑即可,本身需要解决以下几大难点:1、进位问题,就是两数之和大于等于10后,进位处理问题;以及用好原创 2021-01-05 21:02:42 · 108 阅读 · 0 评论 -
题目1、两数之和(Leetcode解题-java实现)
1、需求给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。2、示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], target = 6输出:[原创 2021-01-03 23:45:41 · 159 阅读 · 0 评论