Algorithm
卷曲的葡萄藤
这个作者很懒,什么都没留下…
展开
-
剑指offer(Java版)---- 字符串转换成整数
题目描述将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。解法一:根据题目意思前面可能又+-号,如果出现非0-9的话返回0;所以算法实现首先要判断是否又正负号,有就从角标1开始遍历,每次检查当前字符是否是数字,不是直接返回0;...原创 2019-08-11 20:32:12 · 235 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----202、快乐数
202、快乐数一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。解法一:思路,用set记录每次对一个数进行平方操作后的数,记录一次判断一次这个数是否出现过,或者是否为1,如果出现过说明不是快乐数,如果为1则说明是快乐数。#重点是,不是快乐数会一...原创 2019-05-07 22:29:13 · 488 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----198,打家劫舍
198,打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。class Solution { public int rob(int[] n...原创 2019-05-07 22:28:07 · 359 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----189,求旋转数组
189,求旋转数组解法一:递归旋转,将整个数组旋转,在将后k个元素和0到k-1个元素旋转class Solution { public void rotate(int[] nums, int k) { int n=nums.length; k = k%n; reverse(nums,0,n-1); reverse...原创 2019-05-07 22:26:58 · 238 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----169、求众数
169、求众数解法一:因为题目中说一定存在众数,且众数是出现次数超过长度的一半。所以本题可以先进行排序后,去数组最中间的那个数,因为众数超过一半,排序过后最中间的数肯定是众数。class Solution { public int majorityElement(int[] nums) { int n = nums.length; ...原创 2019-05-07 22:26:01 · 215 阅读 · 0 评论 -
LeetCode算法---746. 使用最小花费爬楼梯
解法1:简单的动态规划题目,用一个数据记录每个台阶花费的最少金额。由题意知:cost长度为【2,1000】,从2开始遍历到数组的长度n。其实就是,在第i台阶时,最小的花费时第i-1与i-2台阶最小的花费,因为你直接可以从第i-1或者第i-2上到i台阶。https://blog.csdn.net/weixin_39043567/article/details/89646438爬楼梯题...原创 2019-05-07 22:23:39 · 214 阅读 · 0 评论 -
LeetCode(Java版)-11. 盛最多水的容器
解法1:暴力O(n^2)这个就算了。。解法2:两头开始扫描,记录当前的area和maxArea,因为面积和高度和长度有关,最大的话要么长要么高。所以每次求完面积,要从高度低的那个位置向对面靠拢。每次把当前面积和最大面积比较。执行用时 :6 ms, 88.90%.内存消耗 :43.7 MB, 76.62% .class Solution { public int ma...原创 2019-05-06 23:48:45 · 239 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----26.、删除排序数组中的重复项
26.、删除排序数组中的重复项描述:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。解法1:遍历数组,i作为慢下标,j作为快下标,当j查找到与i不相同的时候就将i+1置为这个不同的数,然后i往前移动。直到遍历结束。class Solution ...原创 2019-04-25 18:29:11 · 134 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----21、合并两个有序链表
21、合并两个有序链表描述:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。解法1:创建一个新的链表,遍历比较l1和l2的节点的值,小的头插到新的链表中。当其中一个链表为空的时候,直接将另一个剩余的部分插进去。/*** Definition for singly-linked list.* public class ListNode...原创 2019-04-25 18:27:17 · 212 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----150. 逆波兰表达式求值
解法1:构建一个栈,循环string数组,讲数组中的元素转换成int放入栈中,如果出现了异常,说明是操作符号。然后捕获进行处理,即出栈两个元素进行相应的加减乘除操作。操作后的结果在放入栈中,最终栈中的元素即为最终结果。class Solution { public int evalRPN(String[] tokens) { Stack<Integer>...原创 2019-05-27 16:35:13 · 317 阅读 · 0 评论 -
剑指offer刷题笔记(Java版)---- 找出数组重复数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。简单而言就是:找出数组中重复的数字存入到一个数组中。解法一:简单想法就是利用hashmap,遍历数组放入hash...原创 2019-08-07 17:39:17 · 196 阅读 · 0 评论 -
剑指offer刷题笔记(Java版)---- 构建乘积数组
本題首先需要清楚的理解題目的意思,然後在去想法解題。题目描述给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。有些題目看着不是很清晰的話,可以適當的去畫圖觀察一下,比如本題數組就取A[1,2,3,4,5]這些元素。那麼B[i]與A[...原创 2019-08-08 00:24:12 · 186 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----142. 环形链表入口
给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。说明:不允许修改给定的链表。/** * Definition for singly-linked list. * class ListNode { * ...原创 2019-07-06 17:32:29 · 356 阅读 · 0 评论 -
剑指offer刷题笔记(Java版)---- 斐波那契(三种解法)
解法1:最容易想到的,递归呗。缺点,重复计算多啊,数大的话容易栈溢出比如:Fibonacci(5) =Fibonacci(4)+Fibonacci(3) =Fibonacci(3)+Fibonacci(2)+Fibonacci(2)+Fibonacci(1) ...原创 2019-06-03 23:39:29 · 205 阅读 · 0 评论 -
剑指offer刷题笔记(Java版)---- 跳台阶(递归,动态规划,)
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解法1:容易想到的,递归,缺点有较多的重复计算public class Solution { public int JumpFloor(int target) { if(target==1){ ...原创 2019-06-10 10:00:59 · 295 阅读 · 0 评论 -
剑指offer刷题笔记(Java版)---- 两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解法:比较简单,栈1用来push,栈2用来pop。比如:123首先push到栈1,出栈的时候,把栈1里面的数据push到栈2,然后在pop栈2。import java.util.Stack;public class Solution { Stack<Integer> stack1...原创 2019-06-02 22:23:34 · 117 阅读 · 0 评论 -
剑指offer刷题笔记(Java版)---- 从尾到头打印链表
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。解法1 :首先我们想到的就是递归实现了,其实底层也是栈。/*** public class ListNode {* int val;* ListNode next = null;* ListNode(int val) {* this.val =...原创 2019-06-02 10:54:41 · 125 阅读 · 0 评论 -
剑指offer刷题笔记(Java版)---- 二维数组中的查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解法1:采用二分查找的思想,题干中给了,从做到右从上到下是递增的,对每一维进行一次二分查找。public class Solution { public boolean Find(...原创 2019-06-01 22:42:06 · 135 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----20、括号匹配
20、括号匹配描述:给定一个只包括'(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。解法1:首先想到遍历给定的括号字符串,遇到左括号尾加到StringBuilder中,遇到右括号就比对StringBuilder中最后一个括号是否和当前的右括号...原创 2019-04-25 18:26:18 · 564 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----14、最长公共前缀
14、最长公共前缀描述:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。解法1:用StringBuilder来存放公共前缀。先记录第一个字符串的第一个字符,遍历字符串数组,和数组中的每一个字符串进行比对。如果有一个不同或者达到了数组中最小字符串的length时就返回当前的sb。class Solution { public String ...原创 2019-04-25 18:25:34 · 219 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----13、罗马数字转整数
13、罗马数字转整数描述:字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做II,即为两个并列的 1。12 写做XII,即为X+I...原创 2019-04-25 18:24:39 · 195 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----83、删除链表中重复的元素
83、删除链表中重复的元素描述:解法1:设置两个指针p q,两个指针指向的值不相等时同步往后移,相等时删除操作。当q为空的时候结束。/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(in...原创 2019-04-28 21:35:02 · 174 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----70、爬楼梯(递归,非递归等实现)
70、爬楼梯描述:假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定n是一个正整数。解法1:采用递归实现,不过在力扣中提交超时了。思路:找到程序的出口,即f(n) = f(n-1)+f(n-2)。但是递归中有很多重复的计算,还需要优化。解释,比如有5阶楼梯,需要我们求爬到5阶能有多少种次数?因为...原创 2019-04-28 21:33:44 · 753 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----67、二进制求和
67、二进制求和描述:给定两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字1和0。解法1:比较粗暴的方法,先找到较短的字符串,从右网左扫描。对应依次相加(**注意字符转整形 -‘0’!)后插入到StringBuilder的头中,分三种情况:《=1就直接存到StringBuilder ,不进位。等于2时,replace头为0,同时进位。等于3时,repla...原创 2019-04-28 21:32:08 · 329 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----66、加一
66、加一描述:解法1:从数组中的末尾开始遍历,加1后判断是否大于10,大于则取余数,进位设为1;小于则进位设为0;遍历完如果进位为1的话需要在原始的数组的头部进位,解决办法是创建一个length+1的新数组,将第一个元素设置为1后,后面的元素整体copy进行加1处理后的原始数组。执行用时:1 ms, 61.85% 。内存消耗:20.5 MB, 72.64% 。class ...原创 2019-04-28 21:30:06 · 225 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----53、最大子序列和
53、最大子序列和描述:给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。解法1:暴力法,嵌套for循环,求出每个字串的和,最后找出最大的。效率很低。class Solution { public int maxSubArray(int[] nums) { int max = nums[0]; ...原创 2019-04-28 21:28:33 · 379 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----28、实现strStr()
28. 实现strStr()描述:实现strStr()函数。给定一个haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回-1。解法1:遍历找到haystackclass Solution { public int strStr(String haystack,...原创 2019-04-28 21:25:59 · 178 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----27、 移除元素
27. 移除元素描述:给定一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。解法1:与删除排序数组中的重复项思想一致,慢指针和快指针,遍历数组,快指针遇到非val的时候就把值赋给...原创 2019-04-28 21:25:04 · 134 阅读 · 0 评论 -
LeetCode刷题笔记—简单题(Java版)(二)
169、求众数解法一:因为题目中说一定存在众数,且众数是出现次数超过长度的一半。所以本题可以先进行排序后,去数组最中间的那个数,因为众数超过一半,排序过后最中间的数肯定是众数。class Solution { public int majorityElement(int[] nums) { int n = nums.length; ...原创 2019-04-17 21:53:19 · 453 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----88、合并两个有序的数组
88、合并两个有序的数组描述:给定两个有序整数数组nums1和nums2,将nums2合并到nums1中,使得num1成为一个有序数组。说明:初始化nums1和nums2的元素数量分别为m和n。你可以假设nums1有足够的空间(空间大小大于或等于m + n)来保存nums2中的元素。解法1:class Solution { publ...原创 2019-04-28 21:35:45 · 237 阅读 · 0 评论 -
LeetCode(Java版)19. 删除链表的倒数第N个节点
解法1:不需要去遍历两次,一次即可,思路是,用两个指针p,q先指向头节点,让q指针走到第n个位置,然后两个指针同时往后走,走到q.next==null是说明p已经到达倒数第n个节点的前面的那个节点,此时删除下一个节点即可。注意:当删除头节点和只有一个元素的情况。执行用时 :2 ms,95.78% .内存消耗 :34.4 MB, 89.34% 。/** * Definition...原创 2019-05-04 15:32:21 · 1153 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----7、整数反转
整数反转描述:将一个32位整数进行反转,321——>123-3123—>-3213解法1:简单思路,将int x转换成stringBuffer 进行反转,同时去掉 ‘-’ 以便能够将str转换到double类型,double是为了检测是否超过了int的最大值,超过了则返回0。判断x小于零的话返回相应负的值。class Solution { public int ...原创 2019-04-25 18:23:33 · 155 阅读 · 0 评论 -
LeetCode刷题笔记—(Java版)----2.两数相加
2、两数相加描述:给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807...原创 2019-04-25 18:21:35 · 198 阅读 · 0 评论 -
LeetCode刷题笔记—(Java版)-----1.两数之和
描述:找到数组中两个数相加和为target的数组下标。解法1:简单粗暴的方法,嵌套循环数组,返回相加为target的两个数的下标。class Solution {public int[] twoSum(int[] nums, int target) {for(int i =0;i<nums.length;i++){ //嵌套循环找到相加为target...原创 2019-04-25 18:20:22 · 219 阅读 · 0 评论 -
LeetCode刷题笔记(Java版)----4. 寻找两个有序数组的中位数
4. 寻找两个有序数组的中位数解法1:比较容易想到的办法,由于对时间复杂都有一定的要求,空间换时间。新建一个新的数组,将两个数组有序插入到新的数组中。最终如果时奇数个的话直接返回新数字的中间数,偶数的话返回数组中间两个数的平均数。执行用时 :11 ms, 97.73%。内存消耗 :46.1 MB, 97.20% 。class Solution { public doub...原创 2019-04-30 10:57:03 · 1138 阅读 · 0 评论 -
LeetCode(Java版)-876. 链表的中间结点
876. 链表的中间结点解法1:快慢指针,快指针走到末尾的时候慢指针走到中间。注意空指针的异常。执行用时 :0 ms, 100.00% 。内存消耗 :34.2 MB, 47.52%。 /** * Definition for singly-linked list. * public class ListNode { * int val; * ...原创 2019-05-05 10:34:01 · 158 阅读 · 0 评论 -
LeetCode(Java版)21. 合并两个有序链表
解法1:思路很简单。创建一个新节点,遍历两个链表每次将小的插入到新节点的后面。执行用时 :2 ms, 98.12% 。内存消耗 :34.7 MB,97.55%。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ...原创 2019-05-05 09:29:36 · 100 阅读 · 0 评论 -
LeetCode(Java版)-206. 反转链表
解法1:画个图就很明了了,定义两个指针pre和curr,当curr不为空时循环:每次创建个临时指针temp,存放curr后边的节点防止丢链,将当前节点指向pre节点,再将pre移动到curr,curr移动的他的下个节点也就是temp。循环结束pre就是头节点。/** * Definition for singly-linked list. * public class Lis...原创 2019-05-04 18:40:38 · 229 阅读 · 0 评论 -
LeetCode(Java版)-61. 旋转链表
给定一个链表,旋转链表,将链表每个节点向右移动k个位置,其中k是非负数解法1:把链表连成一个环,把倒数第k个位置置为头节点即可。需要注意旋转长度为链表长度时,链表未发生改变。即当旋转大于链表长度时需要k%length操作。执行用时 :2 ms,98.79% 。内存消耗 :35.1 MB,91.37% 。/** * Definition for singly-lin...原创 2019-05-04 17:02:43 · 276 阅读 · 0 评论 -
LeetCode刷题笔记—简单题(Java版)
记录LeetCode算法学习路程。1、两数之和描述:找到数组中两个数相加和为target的数组下标。解法1:简单粗暴的方法,嵌套循环数组,返回相加为target的两个数的下标。class Solution { public int[] twoSum(int[] nums, int target) { for(int i =0;i<nu...原创 2019-02-20 13:26:28 · 1248 阅读 · 1 评论