自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 LeetCode ---- 43、字符串相乘

题目链接思路: public String multiply(String num1, String num2) { if (num1 == null || num2 == null || num1.length() == 0 || num2.length() == 0 || num1.equals("0") || num2.equals("0")) { return "0"; } int

2020-05-31 22:20:52 90

原创 LeetCode ---- 40、组合总和 II

题目链接思路:这道题与39题思路一致,只是在添加结果的过程中,要做到不重复,那么需要在回溯的过程中进行剪枝,当出现与之前数相同时,需要跳过这个数不选。 public List<List<Integer>> combinationSum2(int[] candidates, int target) { List<List<Integer>> res = new ArrayList<>(); if (

2020-05-30 23:29:44 102

原创 LeetCode ---- 39、组合总和

题目链接思路:回溯算法。采用做加法的思路。首先给数字进行排序,有利于后续问题的处理。每次加一个数,若符合要求,则将当前所选中的数加入到结果集合中;若当前数加上之前的和比目标值大,则包括当前数在内的之后的所有数,不论添加哪一个进入当前所选中的集合,都不会满足要求;若当前数加上之前的和比目标值小,则将当前数加入到当前集合中,之后遍历下一个位置的数。回溯算法其实就是在不停的尝试。一条路走到黑,当尝试出结果时,将结果添加进最终结果。详细处理步骤请看代码,注释写的很清楚。 public

2020-05-29 23:07:12 75

原创 LeetCode ---- 36、有效的数独

题目链接思路:主要是找出坐标之间的规律。判断行:对于每一行来说,都不可以重复。若这一行所有的位置都填充了数字,且要是有效的一行数独,则这一行的 9 个数字都不重复且为1~9,那么可以使用长度为 9 的数组来进行检验,遍历这一行的每一个数字,第一次出现这个数字num时,将检验数组的第 num - 1 处赋值为1,若之后遍历的过程中出现了这个数子num(检验数组的第 num - 1 处的值为1),则说明这一行不符合要求。判断列:判断列的思路与判断行的思路一致。判断每个3x3小方格:从左往右依

2020-05-28 20:24:16 193

原创 LeetCode ---- 34、在排序数组中查找元素的第一个和最后一个位置

题目链接思路:二分法。采用两次二分算法,分别确定左右边界。确定左边界时,从右边逼近,确定右边界时,从左边逼近。采用左闭右开的区间。即 [ left, right )。找左边界时,当mid处的数大于等于target时,让 right = mid,即缩小上界,而当mid处的数小于target时,需要上提上界,即left=mid+1,之后区间会被分为 [ left, mid ) 或者 [ mid + 1, right )。当left == right时退出这次二分查找,退出之后,需要检查lef

2020-05-27 00:22:47 69

原创 LeetCode ---- 33、搜索旋转排序数组

题目链接思路:采用二分查找法,由于数组是被分为了有序的两段,所以需要每次比较中间值与两端值的大小,来确定那边是有序的,再比较目标值与中间值和左右两端值的小大,来确定目标值落在那一半上。思路参考自:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/comments/114623 public int search(int[] nums, int target) { if (nums == nu

2020-05-25 22:37:22 69

原创 LeetCode ---- 31、下一个排列

题目链接思路:要得到按照字典序的下一个比当前数大的结果,则需要先判断按照字典序能不能得到下一个,因为可能存在当前数就是最大的情况,此种情况下,需要讲整体逆序,即得到最小的那个数。若有下一个(判断标准是:从后往前遍历,当前数的前一个数小于当前数,找到此数时,位置记为 i ),则再次从后往前遍历,找到一个比 i 位置前一个数 (即 i - 1 位置处的数)大的数字,此数字位置记为 r此时,交换 i - 1 和 r 位置处的数,然后对 i 位置后面的数进行逆序即可。因为 i 位置后面的数是降序的,

2020-05-24 14:05:44 118 1

原创 LeetCode ---- 29、两数相除

题目链接思路:两数相除,其实就是在求被除数中包含有多少个除数。使用位运算对求解过程进行加速代码参考自:https://leetcode-cn.com/problems/divide-two-integers/solution/javabu-shi-yong-longxing-yi-wei-xiang-jian-by-jzj1/ public int divide(int dividend, int divisor) { // dividend = -2^31, div

2020-05-23 14:19:42 159

原创 LeetCode ---- 24、两两交换链表中的节点

题目链接思路:因为是两两交换,所以需要注意当只剩下一个节点的时候,就不需要交换了。下面开始使用例子来讲解代码:原链表如下:三个指针,cur记录当前节点,curNext记录cur的next节点,curNextNext记录curNext的next节点开始翻转next指针指向,前两个翻转:第3和第4个翻转:最后拉直链表: public ListNode swapPairs(ListNode head) { if (head ==

2020-05-22 11:31:04 107

原创 LeetCode ---- 22、括号生成

题目链接思路:采用回溯算法。因为生成括号的时,一定要配对,即左括号可以多,但是右括号一定不能多,否则将会配对失败。解法一:做加法。左边的括号总数与右边的括号总数都从0开始加,直到左右都加到n时,此时所拼成的括号满足要求,添加进最终的解中。 public List<String> generateParenthesis(int n) { List<String> res = new ArrayList<String>();

2020-05-21 13:51:32 67

原创 LeetCode ---- 19、删除链表的倒数第N个节点

题目链接思路:双指针。题目需要删除的是倒数第N个节点,则需要知道倒数第N+1个节点,即倒数第N个节点的前一个节点。找到这个节点之后,将该节点的next指向倒数第N个节点的next所指向的节点。初始时,两个指针指向头。让一个指针从头开始先走N步,然后两个指针一起向后走,若先走的指针走到了空节点,则已找到倒数第N个节点(后走的指针所指向的节点),在此过程中,需要记录后走的指针的前一个节点,便于后面进行连接。 public ListNode removeNthFromEnd(ListN

2020-05-19 13:18:15 78

原创 LeetCode ---- 18、四数之和

题目链接思路:与此题类似的如第15题:三数之和;第16题:最接近的三数之和等,这类题目首先都需要给数组排序,排序后处理起来会方便很多。首先给数组进行排序。接着开始遍历数组,因为要寻找四个数字,则需要四个变量去表示当前所选的数组中的位置。i public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> result.

2020-05-18 14:56:30 55

原创 LeetCode ---- 17、电话号码的字母组合

题目链接思路: ArrayList<String> result = new ArrayList<>(); public List<String> letterCombinations(String digits) { if(digits == null ||digits.length() == 0){ ...

2020-05-16 13:15:18 184

原创 LeetCode ---- 16、最接近的三数之和

题目链接思路: public int threeSumClosest(int[] nums, int target) { if (nums == null || nums.length < 3) { throw new RuntimeException("不存在这样的三个数"); } Arrays.sor...

2020-05-15 13:19:29 60

原创 LeetCode ---- 12、整数转罗马数字

题目链接思路: public String intToRoman(int num) { if (num < 1) { return ""; } int[] numList = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; S...

2020-05-14 13:48:33 92

原创 LeetCode ---- 11、盛最多水的容器

题目链接思路: public int maxArea(int[] height) { int ans = 0; int i = 0, j = height.length - 1; while (i < j) { ans = Math.max(ans, (j - i) * Math.min(height[i...

2020-05-13 21:39:58 61

原创 LeetCode ---- 6、Z 字形变换

题目链接思路: public String convert(String s, int numRows) { if (s == null || s.length() < 2 || numRows < 2 || s.length() <= numRows) { return s; } St...

2020-05-12 21:00:07 107

原创 LeetCode ---- 5、最长回文子串

题目链接解法一: public String longestPalindrome(String s) { if (s == null || s.equals("")) { return ""; } int start = 0, end = 0; for (int i = 0; i < s....

2020-05-10 14:49:21 55

原创 LeetCode ---- 3、无重复字符的最长子串

题目链接解法一:暴力解法 public int lengthOfLongestSubstring(String s) { Set<Character> set = new HashSet<>(); int max = 0; int i = 0, j = 0; while (i < s....

2020-05-09 20:56:41 66

原创 LeetCode ---- 2、两数相加

题目链接思路:准备一个变量记录每次相加之后的进位。遍历两个链表,相加对应位置的数(和为sum),并将结果(sum % 10)记录在一个新的节点中,之后将节点连接在一起即可。 public ListNode addTwoNumbers(ListNode l1, ListNode l2) { if (l1 == null || l2 == null) { ...

2020-05-08 13:42:43 77

原创 LeetCode ---- 198、打家劫舍

题目链接思路:

2020-05-08 13:35:01 88

原创 LeetCode ---- 191、位1的个数

题目链接思路:每一位与1进行与操作,若结果是1,则位1的个数加一,否则跳过。遍历完整个二进制所有位数,结束返回。 public int hammingWeight(int n) { int result = 0; while (n != 0) { if ((n & 1) == 1) { ...

2020-05-07 13:29:30 49

原创 LeetCode ---- 190、颠倒二进制位

题目链接思路:翻转二进制位,可以理解为将二进制的每一位(假设为第 i 位)向左移 31 - i 位,并且每一次需要将原始二进制向右移动一位,保证每一次需要向左移动的二进制位在第0位,直到原始二进制为0,即可实现翻转。例如: 此处以 4 位二进制位举例。原始 1 1 0 0 翻转后为 0 0 1 1取出第 0 位,向左移动 4 - 0 位, 即 0 * * *,...

2020-05-07 13:25:54 79

原创 LeetCode ---- 189、旋转数组

题目链接思路:首先,对数组整体进行翻转,之后再对前 k 个数进行翻转,剩余数进行翻转即可。例: 1 2 3 4 5 6 7 向右移动 3 个位置,结果为 5 6 7 1 2 3 4 第一步,对整体翻转: 7 6 5 4 3 2 1 第二步,对前 3 个数翻转:5 6 7 4 3 2 1 第三步,对剩余数翻转: 5 6 7...

2020-05-06 13:34:24 52

原创 LeetCode ---- 172、阶乘后的零

题目链接思路:一个数的阶乘中的零的个数取决于2和5的个数,因为只有2乘5才会出现0,又因为拥有因子2的数比拥有因子5的数多,所以最终零的个数取决于从1~n中有多少个因子5。例如:10的阶乘。10!= 3628800 即有两个零。 从1~10中间,有两个5,一个是5,另一个是10里面包含的因子5。而2有很多,2,4,6,8这些都可以跟5乘得到一个0。所以,...

2020-05-06 13:21:05 96

原创 LeetCode ---- 171、Excel表列序号

题目链接思路:此题与168题解法刚好相反。但都是使用26进制数。使用26进制来求解,类比于二进制转十进制,此题为26进制转十进制。从字符串最后一个字符开始向前遍历,统计每一个位置的字母所代表的数字的大小,全部加起来,返回即可。举例:"ABCD",A所在位置代表26^3,B所在位置代表26^2,C所在位置代表26^1,D所在位置代表26^0 A代表1,B代表2...

2020-05-05 13:28:50 70

原创 LeetCode ---- 169、多数元素

题目链接解法一:准备一个Map,用于存储出现的数字以及这个数字出现的次数。遍历数组,填充Map,若这个数字之前出现过,则次数加1,否则直接put进Map中,次数为1。之后,遍历Map,找到次数大于数组长度一半的那个元素。若没有这个数字,则返回 -1 。 public int majorityElement(int[] nums) { HashMap&lt...

2020-05-05 13:17:04 97

原创 LeetCode ---- 168、Excel表列名称

题目链接思路:转为26进制,进行计算。注意:要对当前数减一,因为计算机中第一个数为0开始,Excel中从1开始。 public String convertToTitle(int n) { if (n <= 0) { return ""; } StringBuilder sb = new String...

2020-05-04 13:28:04 71

原创 LeetCode ---- 167、两数之和 II - 输入有序数组

题目链接思路:双指针。i 指向数组头,j 指向数组尾。准备一个result数组记录答案。若 arr[i] + arr[j] = target,则 result[0] =i+ 1,result[1] = j + 1。若 arr[i] + arr[j] <target,则 i 向后走。若 arr[i] + arr[j] > target,则 j向前走。 ...

2020-05-04 13:21:33 61

原创 LeetCode ---- 160、相交链表

题目链接思路:统计两个链表的长度,再计算长度差count,让较长的链表从头节点向后走count步,然后两条链表的节点开始一起向后走,当两个链表的节点相同时,则此时所指向的节点即为交点。过程中若遇到空节点,则说明不相交。利用长度差,可以将两条链表剩余的长度保持一致。 public ListNode getIntersectionNode(ListNode headA, Lis...

2020-05-03 13:33:37 50

原创 LeetCode ---- 155、最小栈

题目链接思路:准备两个栈,其中一个是辅助栈,用于记录当前栈中的最小值。push时,普通栈内直接push进元素, 辅助栈:若此时辅助栈为空,则将此元素直接入栈,若不为空,此元素与栈顶元素进行比较,将小的元素入栈。pop时,若普通栈内为空,则抛出异常, 若普通栈不为空,则普通栈与辅助栈同时弹出栈顶元素。top时: 若普通栈...

2020-05-03 13:27:36 76

原创 LeetCode ---- 141、环形链表

题目链接解法一:使用双指针。一个快指针,每次走两步,一个慢指针,每次走一步。当快慢指针相遇时,一定说明链表有环,且在环上相遇。若走的过程中,快指针遇到了null,则说明此链表一定不包含环。证明略。 public boolean hasCycle(ListNode head) { if (head == null || head.next == null) { ...

2020-05-02 13:37:33 77

原创 LeetCode ---- 136、只出现一次的数字

题目链接解法一:使用异或运算。每个数异或自己等于0,0异或任何数等于任何数,用公式表达 : a^a = 0,0 ^ b= b。由于数组中除了出现一次的数,其余数都出现了两次,则将数组中每个元素进行异或运算后,最终结果即为只出现了一次的那个数。 public int singleNumber(int[] nums) { int result = 0; ...

2020-05-02 13:31:20 62

原创 LeetCode ---- 125、验证回文串

题目链接解法一:双指针。i 指向头,j 指向尾。若 i 位置的字符不是数字也不是字母,则 i 向后移,直到找到一个位置的字符是字母或者数字。j 同理,不是字母或数字时,j 前移,直到找到字母或数字。当找到时,判断 i 位置和 j 位置的字符是否相等。最后判断 i 位置与 j 位置的关系即可判断此字符串是否是回文串。 public boolean isPalindrome(Str...

2020-05-01 13:29:21 64

原创 LeetCode ---- 122、买卖股票的最佳时机 II

题目链接思路:只要今天价格比昨天的价格高,就可以在昨天买入,今天卖出(此处,今天可以重合,即今天卖出了,今天还可以买入)。将所有符合的条件的利润加在一起就是最大利润。 public int maxProfit(int[] prices) { if (prices == null || prices.length == 0) { retur...

2020-05-01 13:13:10 56

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除