算法日记
萧子术
这个作者很懒,什么都没留下…
展开
-
LeetCode 第21题:合并两个有序链表
题目解题思路:运用递归!什么是递归呢?函数在运行时自己调用自己 这个函数就叫 递归函数,调用的过程就叫递归。比如定义函数 f(x)=x+f(x-1)def f(x): return x + f(x-1)如果代入f(2):返回 2 + f(1);调用f(1);返回 1+f(0);调用f(0);返回 0 +f(-1)。。。。。。这时程序会无休止地运行下去,直到崩溃。如果我们加入一个判断语句 x>0 :f(x): if(x > 0)原创 2021-02-12 10:50:28 · 113 阅读 · 0 评论 -
LeetCode 第二十题 有效括号 利用栈辅助
题目解题思路代码:import java.util.Stack;public class test { public boolean isValid (String s) { Stack<Character> stack = new Stack<>(); //将字符串转换为数组形式,方便操作 char [] chars = s.toCharArray(); //遍历所有元素原创 2021-02-10 10:34:39 · 112 阅读 · 0 评论 -
LeetCode 第十九题 删除链表的倒数第N个结点
解题思路:标签:链表整体思路是让前面的指针先移动n步,之后前后指针共同移动,直到前面的指针到尾部为止首先设立预先指针pre,预先指针是一个小技巧设预先指针pre的下一个节点指向 head ,设前指针为 start,后指针为 end,二者都等于 prestart 先向前移动n步之后start和end共同向前移动,此时二者的距离为n,当start到达尾部时,end 的位置恰好为倒数第n个结点的前一个结点因为要删除该结点,所以要移动到该结点的前一个结点才能删除,所以循环条件为 start.nex.原创 2021-02-09 10:22:52 · 69 阅读 · 0 评论 -
LeetCode 第十四题 四数之和 带注释
题目思路参考三数之和:三数之和代码import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class test { public List<List<Integer>> fourSum (int[] nums,int target) { //定义一个返回值 List<List<Integer>> re原创 2021-02-08 11:54:19 · 76 阅读 · 0 评论 -
LeetCode 第17题 电话号码的字母组合 回溯法注释详解
题目解法思路代码import java.util.ArrayList;import java.util.List;public class test { //在外面定义这些变量可以减少backTrack函数的参数,免得参数太长,头晕 //定义res,用来装结果 List<String> res = new ArrayList<>(); //定义track,用来装满足条件的单个字符 StringBuilder track = n原创 2021-02-01 09:56:08 · 211 阅读 · 0 评论 -
LeetCode 第16题 最接近的三数之和
题目思路:标签:排序和双指针本题目因为要计算三个数,如果靠暴力枚举的话,时间复杂度会到O(n^3),需要降低时间复杂度首先进行数组排序在数组nums中,进行遍历,每遍历一个值利用其小标i,形成一个固定值nums[i]再使用前指针指向start=i+1处,后指针指向 end =nums.length-1处也就是结尾处根据sum = nums[i]+nums[start]+nums[end]的结果,判断sum与目标target的距离,如果更接近则更新结果 ans同时判断sum与target的原创 2021-01-31 08:45:36 · 129 阅读 · 0 评论 -
LeetCode 第十五题 三数之和 利用双指针和List
题目:思路:标签:数字遍历首先对数组进行排序,排序后固定一个数 nums[i],再使用左右指针指向nums[i]后面的两端,数字分别为nums[L]和nums[R],计算三个数的和 sum 判断是否满足为0,满足则添加进结果集如果nums[i]大于0,则三数之和必然无法大于0,结束循环如果nums[i] == nums[i-1],则说明该数字重复,会导致结果重复,所以应该跳过当sum == 0 时,nums[L]==nums[L+1]则会导致结果重复,所以应该跳过,L++当 sum ==原创 2021-01-30 09:22:30 · 86 阅读 · 1 评论 -
LeetCode 第14题 最长公共前缀
思路:当字符串数组长度为0时,则公共前缀为空,直接返回令最长公共前缀 ans 的值为第一个字符串,进行初始化遍历后面的字符串,依次将其与ans进行比较,两两找出公共前缀,最终结果即为最长公共前缀如果查找的过程中出现了 ans 为空的情况,则公共前缀不存在,直接返回代码在这里插入代码片 public String longestCommonPrefix(String[] strs) { if(strs.length == 0) return ""; .原创 2021-01-29 08:59:20 · 61 阅读 · 0 评论 -
LeetCode 11题 盛最多水的容器
给你n个非负整数,每个数代表坐标中的一个点(i,ai)。在坐标内画n条垂直线,垂直线i的两个端点分别为(i,ai)和(i,0)。找出其中的两条线,使得他们与x轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器代码 public int maxArea(int[] height) { int i=0,j=height.length-1,res =0; while(i<j) { res=height[i]<转载 2021-01-26 09:38:56 · 76 阅读 · 0 评论 -
LeetCode 12 题 整数转罗马数字
题目:思路:这道题使用 贪心算法 的直觉来源是:尽可能优先使用较大数值对应的字符,最后转换得到的罗马数字的字符数个数更少,字符更少更方便使用,这一个也是设计罗马数字的人们的初衷。方法:贪心算法在以前还使用现金购物的时候,找零钱的时候,一般商家会尽量选择面值答的纸币个顾客,这样才会使得个顾客的纸币张数最少,让顾客点钱的时候方便代码:public String intTORoman(int num) { //把阿拉伯数字与罗马数字可能出现的所有情况和对应关系,放转载 2021-01-27 09:01:14 · 88 阅读 · 0 评论 -
LeetCode 第九题 回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例1:输入:123输出:true示例2:输入 -121输出:false解法一:整数转换成字符串思路:先将整数转化为字符串,然后利用 reverse()方法,将字符反转,最后利用 equals()方法,来判断字符串是否相等代码public boolean isPalindrome(int x) { String reversedStr = (new StringBuilder(x+原创 2021-01-25 10:33:41 · 100 阅读 · 1 评论 -
LeetCode 第八题 字符串转换整数(atoi)
首先想到一个逻辑 ,用取余方式取得最后一位数pop,然后用res保存最后结果res = res * 10 + pop. 想到这里其次就是在获得执行这步之前判断结果是否溢出,假设整数是正数,如果res = res *10 + pop 导致Integer溢出,那么一定是 res>=Integer.MAX_VALUE /10;(1)res>Integer.MAX_VALUE,一定溢出返回0(2)res=Integer.MIN_VALUE,因为整数能存的最大整数是2147483647 所...原创 2021-01-24 22:13:19 · 97 阅读 · 0 评论 -
LeetCode 第七题 整数反转 修改版
给你一个32位的有符号整数 x,返回 x 中每位上的数字反转后的结果。如果反转后整数超过32位的有符号整数的范围[-231 2^31-1] 就返回0示例输入:x = 123输出: 321输入 -123输出: 321输入:120输出: 21解题思路: 首先我们思考一下,怎么去反转一个整数 ?用 栈?或者把整数变成 字符串 再去反转这个字符串?这两种方法也是可以的,但是并不好。实际上我们只需要能拿到这个整数的 末尾数字 就可以了。以 12345 为例,先拿到 5,再拿到 4,之后是 3,2原创 2021-01-23 23:43:54 · 157 阅读 · 0 评论 -
LeetCode 第七题 整数反转
给你一个32位的有符号整数 x,返回 x 中每位上的数字反转后的结果。如果反转后整数超过32位的有符号整数的范围[-231 2^31-1] 就返回0示例输入:x = 123输出: 321输入 -123输出: 321输入:120输出: 21我的错误解题思路: 将整数转换成字符串来做,利用栈,先进后出的思想,虽然最后没有实现,但是我也学到了许多东西代码import java.util.Stack;public class test { public static void ma原创 2021-01-22 23:43:08 · 220 阅读 · 0 评论 -
LeetCode第六题 Z字形变换
将一个给定字符串 s 根据给定的行数 numRows,以从上往下,从左往右进行 Z 字形排列。解题思路(来着LeetCode用户:krahets)题目理解: 字符串 s 是以Z字形为顺序存储的字符串,目标是按行打印。设 numRows 行字符串分别为 s1,s2,,,,sn,则容易发现:按顺序遍历字符串s时,每个字符 c 在Z字形中对应的 行索引 先从 s1 增大至 sn,再从 sn 减小至s1.。。如此反复因此,解决方案是:模拟这个 行索引的变化,在遍历s中把每个字符填到正确的行 res[i]原创 2021-01-21 10:28:17 · 207 阅读 · 8 评论 -
LeetCode 第五题 最长回文串
给你一个字符串s,找到s中最长的回文串。示例:输入:s= “”babad“”输出:“”bab“”解释:“”aba“” 同样也是符合题意的答案方法一:暴力枚举大概思路:根据回文串的定义,我们可以枚举所有大于等于2的字符串。在这些字符串中找到 回文串 然后记录它的长度,让所有的 回文串 的长度进行比较,找到最长的那个回文串即可小技巧:在记录最长回文子串的时候,我们可以只记录“当前子串的起始位置”和“子串的长度”不必作截取代码参考自 LeetCode用户:liweiwei1419 //暴力匹配原创 2021-01-20 13:47:10 · 68 阅读 · 0 评论 -
LeetCode第三题 寻找两个正序数组的中位数
给定两个大小为m和n的正序(从小到大)数组 num1 和num2.请你找出并返回这两个正序数组的中位数。进阶:你能设计一个时间复杂度为o(log(m+n))的算法解决此问题吗?实例:输入:num1 = [1,3],num2 = [2]输出:2.00000解释:合并数组 = [1,2,3],中位数 2方法一:利用import org.apache.commons.lang3.ArrayUtils 来合并数组 ; java.util.Arrays.sort();来将数组中的数值排序代码impor原创 2021-01-19 11:07:59 · 119 阅读 · 1 评论 -
LeetCode 第三题 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度示例输入: s=“abcabcbb”输出: 3解释:因为无重复字符的最长子串是"abc",所以其长度为 3方法一: 暴力枚举总体思路:遍历字符串,每次以i记录,不回溯i值,用flag记录遍历过程中找到的重复的字符的位置,用 pos 来记录与flag重复的字符。如果找到一样的字符,则更新flag:flag=pos+1,并用result记录这个字符串的长度。代码public class test { public stat原创 2021-01-18 12:03:20 · 181 阅读 · 2 评论 -
LeetCode 第二题 两数相加
给你两个 非空 的链表,表示两个非负的整数,它们每位数字都是按照 逆序 的方式储存的,并且每个节点只能储存一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。解题思路:将两个链表看成是相同长度的进行遍历,如果一个链表较短则在前面补0,比如,987 + 23 = 987 + 023 = 1010每一位计算的同时需要考虑上一位的进制问题,而当前位计算结束后同要需要更新进位值如果两个链全部遍历完毕后,进位值为1,则在新链表最前方添加节点1原创 2021-01-17 20:51:10 · 98 阅读 · 1 评论 -
萧子术的第一道编程算法题
标题:用java实现 给定一个整数数组 nums 和一个整数目标值target,请你在该数组中找出 和为目标值的那两个 整数,并返回它们的数组下标。你可以假设每种输入只**会对应一个答案。**但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。大家好!我是 萧子术 这是我第一次写博客。以下内容将记录并督促自己每天写一道算法题。加油~奥利给!``2021年1月16日,地点:家里 天气:阴天这是第一道题目题目内容:给定一个整数数组 nums 和一个整数目标值target,请你在该数组原创 2021-01-16 15:52:11 · 103 阅读 · 0 评论