
LeetCode
weihubeats
开源框架Tlog贡献者,技术大多都源于生产实践,乐于分享.公众号:小奏技术
展开
-
LeetCode 每日一题231. 2 的幂
常规解法最简单也是最容易想到的,递归将目标数一直 除以 2 如果 = 1 则代表是2的幂,递归终止条件为目标数对2 取余不为 0,其次要注意是2的幂肯定大于0编码实现:class Solution { public boolean isPowerOfTwo(int n) { if (n <= 0) return false; while (n % 2 == 0) n /= 2; return n == 1; }}时间复杂度.原创 2021-05-30 22:39:26 · 262 阅读 · 1 评论 -
LeetCode每日打卡之前K个高频单词
题目解题思路很明显我们先需要把所有词语出现的次数算出来。然后再更具词语的次数和词语进行排序。计算次数我们可以使用一个map解决,排序我们可以使用右下队列PriorityQueue。然后在PriorityQueue中保存我们需要的k个字母,并让出现次数最少的在队列的最前面,如果后续的字母出现次数比PriorityQueue队列中最前面的字母出现次数要大,则队列中最前面的字母出队,然后新字母入队。如此循环即可。实现代码如下:public List<String> topKFrequent(原创 2021-05-20 22:39:29 · 173 阅读 · 0 评论 -
LeetCode每日打卡之罗马数字转整数
初步看到觉得很简单,将罗马数字与对应的值用一个map装入,然后从右向坐遍历,如果右边的值大于右边向前推一位的值,则需要将右边的大值 - 小值,然后跳过小值循环下一位比如CIV就需要计算 V的值然 - I的值,然后再直接计算C的值。实现代码如下public int romanToInt(String s) { Map<Character, Integer> map = new HashMap(); map.put('I', 1); map...原创 2021-05-15 20:25:10 · 216 阅读 · 0 评论 -
1734. 解码异或后的排列
异或的相关属性和基础参考之前的博客这一题是 1720 的简单升级版本不同之处很明显,就是没有给出一个 ans[n ]的值让我们通过推导出来的公式encoded[i] XOR perm[i + 1] = perm[i]进行计算所以我们的目的很明确,需要计算出一个perm[i],然后后面的计算就和之前那道简单题一样了如果计算出一个perm[i]呢,这里我们可以通过题意计算出ans[n - 1]计算推导过程如下首先我们将所有的奇数位encoded[i] 进行异或,encoded[1] = p.原创 2021-05-11 21:35:05 · 185 阅读 · 0 评论 -
1720. 解码异或后的数组
困难题我唯唯诺诺,简单题我重拳出击题目看着有点复杂,简单解释就是通过给出的公式encoded[i] = arr[i] XOR arr[i + 1],arr数组,其中encoded[] 为已知,arr[0] 为已知,算出arr[]。其实所以我们要推导出arr[i] = ?? 这么一个公式。在推导前我们先复习一下异或的相关特点:相同数值异或,结果为 0x ^ x = 0任意数值与 0 进行异或,结果为数值本身x ^ 0 = x异或本身满足交换律a ^ b = b ^ a.原创 2021-05-06 21:03:55 · 195 阅读 · 0 评论 -
岛屿类问题的通用解法、DFS 遍历框架
在 LeetCode 中,「岛屿问题」是一个系列系列问题,比如:L200. 岛屿数量 (Easy)463. 岛屿的周长 (Easy)695. 岛屿的最大面积 (Medium)827. 最大人工岛 (Hard)我们所熟悉的 DFS(深度优先搜索)问题通常是在树或者图结构上进行的。而我们今天要讨论的 DFS 问题,是在一种「网格」结构中进行的。岛屿问题是这类网格 DFS 问题的典型代表。网格结构遍历起来要比二叉树复杂一些,如果没有掌握一定的方法,DFS 代码容易写得冗长繁杂。本文将以岛屿问题为例转载 2021-04-26 21:01:51 · 332 阅读 · 0 评论 -
33. 索旋转排序数组
这里暴力很简单,直接一遍for循环public int search(int[] nums, int target) { if (nums == null || nums.length == 0) { return -1; } for (int i = 0; i < nums.length; i++) { if (nums[i] == target) { return .原创 2021-04-21 23:06:41 · 154 阅读 · 1 评论 -
53. 最大子序和
题目的难度是简单,但是自己看了半天硬是没有头绪,总觉得需要使用递归,但是又知道如何下手,以为自己菜呢,原来评论区也有一堆小伙伴是这样顿时我悟了,我应该不菜吧。。。。。。。。。解法一:动态规划思路,如果全是负数,找最大值即可,如果有正数,从正数开始累加,如果累加到值为负数,则说明后面的值对前面累加的结果没有意义,需要舍弃这个累加的数,重新累加,每次累加的结果取最大的值public int maxSubArray(int[] nums) { int res = nums[0];..原创 2021-04-05 21:30:16 · 108 阅读 · 0 评论 -
LeetCode 344. 反转字符串
解法一:最先想到的是用栈解决,先进后出。代码public void reverseString(char[] s) { Stack<Character> stack = new Stack<>(); for (int i = 0; i < s.length; i++) { stack.push(s[i]); } while (!stack.isEmpty()) { .原创 2021-04-04 21:55:56 · 280 阅读 · 0 评论 -
LeetCode 7.整数反转
解法一: 每次取目标数最后一位,原数每次 * 10 + 目标数最后一位,使用long 装返回结果来判断溢出,如果最后返回结果墙砖int 不等于 long返回结果,则说明溢出,直接返回0class Solution { public int reverse(int x) { long result = 0; while(x != 0){ result = result * 10 + x % 10; x = x / 10; .原创 2021-04-02 08:51:22 · 197 阅读 · 0 评论 -
15.三数之和
题目给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]题解暴力破解三层循环,不能包含重复三元组,使用Set,对原数组进行排序时间复杂度 O(n^3)public static原创 2020-08-02 22:26:14 · 202 阅读 · 0 评论 -
20. 有效的括号
题目给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例输入: "()"输出: true输入: "()[]{}"输出: true输入: "(]"输出: false题解很明显符合栈的先入后出特点,我们遇到( 括号,即可把相应的右括号推入栈中,然后遇到右括号直接出栈就好了,最后判断栈是否为空即可j原创 2020-07-30 21:17:06 · 215 阅读 · 0 评论 -
11. 盛最多水的容器
题目给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明说明:你不能倾斜容器,且 n 的值至少为 2。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例:输入:[1,8,6,2,5,4,8,3,7]输出:49题解原创 2020-07-28 21:55:25 · 238 阅读 · 0 评论 -
283. 移动零
题目给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。题解:刚开始没看题想到最简单的就是暴力求解,用一个新数组,如果远数组为0则从数组末尾倒着放,如果不为0则从数组0开始正着放,这种解法用到了新数组,不符合题一,但还是给出思路这里比如原数组是 [0,1,0,3,12]新数组为空第一次循环: [0]原创 2020-07-27 21:30:26 · 216 阅读 · 0 评论 -
两数之和
1. 两数之和解析:1. 暴力循环 时间复杂度为O(n²) public static int[] twoSum(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { ...原创 2020-02-14 22:27:30 · 170 阅读 · 0 评论