算法
Howi Zou
一步一步前进
展开
-
面试题 04.10. 检查子树
面试题 04.10. 检查子树 难度中等52 检查子树。你有两棵非常大的二叉树:T1,有几万个节点;T2,有几万个节点。设计一个算法,判断 T2 是否为 T1 的子树。 如果 T1 有这么一个节点 n,其子树与 T2 一模一样,则 T2 为 T1 的子树,也就是说,从节点 n 处把树砍断,得到的树与 T2 完全相同。 注意:此题相对书上原题略有改动。 示例1: 输入:t1 = [1, 2, 3], t2 = [2] 输出:true 示例2: 输入:t1 = [1, null, 2原创 2022-03-23 00:36:46 · 98 阅读 · 0 评论 -
面试题 08.02. 迷路的机器人
面试题 08.02. 迷路的机器人 难度中等87 设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。 网格中的障碍物和空位置分别用1和0来表示。 返回一条可行的路径,路径由经过的网格的行号和列号组成。左上角为 0 行 0 列。如果没有可行的路径,返回空数组。 class Solution { public List<List<Integer...原创 2022-03-18 14:04:09 · 175 阅读 · 0 评论 -
547. 省份数量
有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。 给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。 返回矩阵中 省份 的数量。 。 情况就是这么个情况,就是一堆原创 2022-03-15 21:00:27 · 96 阅读 · 0 评论 -
649. Dota2 参议院
Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇) Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项: 禁止一名参议员的权利: 参议员可以让另一位参议员在这一轮和随后的几轮中丧失所有的权利。 宣布胜利: 如果参议员发现有权利投票的参议员都是同一个阵营的,他可以宣布胜利并决定在游戏中的有关变化。 给定一个字符串代表每个参议员的阵营。字母原创 2022-02-12 19:19:45 · 109 阅读 · 0 评论 -
121. 买卖股票的zui佳时机 Ⅰ
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。 class Solution { public int maxProfit(int[] prices) { int maxPro = 0, min = prices[0];原创 2022-02-06 00:19:06 · 255 阅读 · 0 评论 -
234. 回文链表
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false class Solution { public boolean isPalindrome(ListNode head) { if(head.next == null){ return true; } List<Integer> list = new ArrayList<>();原创 2022-02-05 23:54:09 · 163 阅读 · 0 评论 -
219. 存在重复元素 II
class Solution { public boolean containsNearbyDuplicate(int[] nums, int k) { Map<Integer, Integer> map = new HashMap<>(); for(int i = 0; i < nums.length; i++){ if(map.containsKey(nums[i]) && i - map.g.原创 2022-01-19 23:00:10 · 276 阅读 · 0 评论 -
461. 汉明距离
class Solution { public int hammingDistance(int x, int y) { int z = x ^ y; String s = Integer.toBinaryString(z); int result = 0; for(int i = 0; i < s.length(); i++){ if(s.charAt(i) == '1'){ .原创 2022-01-19 14:26:32 · 4194 阅读 · 0 评论 -
1509. 三次操作后最大值与最小值的最小差
给你一个数组nums,每次操作你可以选择nums中的任意一个元素并将它改成任意值。 请你返回三次操作后, nums中最大值与最小值的差的最小值。 示例 1: 输入:nums = [5,3,2,4] 输出:0 解释:将数组 [5,3,2,4] 变成 [2,2,2,2]. 最大值与最小值的差为 2-2 = 0 。 示例 2: 输入:nums = [1,5,0,10,14] 输出:1 解释:将数组 [1,5,0,10,14] 变成 [1,1,0,1,1] 。 最大值与最小值的差为 1-0 =...原创 2021-11-26 21:24:49 · 275 阅读 · 0 评论 -
122. 买卖股票的zui佳时机 (二)
给定一个数组 prices ,其中prices[i] 是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 ...原创 2021-11-17 00:45:04 · 10768 阅读 · 0 评论 -
94. 二叉树的中序遍历
已经有相当长一段时间没有写博客了,搞后端框架和学习技术组件实在是身心俱疲 今天简单复习一下中序遍历好了 其实这是个很经典的代码模板,可以当成母模块在其他进阶版的题目中用到 class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<>(); Stack<TreeN原创 2021-11-17 00:40:40 · 69 阅读 · 0 评论 -
面试题 10.01. 合并排序的数组
给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。 初始化A 和 B 的元素数量分别为m 和 n。 方法一: 双指针法: 代码: class Solution { public void merge(int[] A, int m, int[] B, int n) { int[] result = new int[m+n];//造一个新的空间数组,用来存储排序后的数组 ...原创 2021-10-09 00:15:58 · 56 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量).)。 public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int count = 0; while(n != 0){ n = n & (n-1); .原创 2021-09-02 00:30:51 · 38 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
好久没写博客了,前不久刚回到学校,来吧来吧搞起来 题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 这题目我一看到的时候就在想,嗯?半数以上,那排序后肯定在中位数的位置上咯,Arrays.sort()一波然后取索引为num.length/2,但是转念一想,排序的话时间复杂度肯定让我很难堪,所以在我这坨叹为观止的大脑的飞速运转下,去.原创 2021-09-01 19:59:13 · 41 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
题目: 输入两个链表,找出它们的第一个公共节点。 如下面的两个链表: 在节点 c1 开始相交。 示例 1: 首先,我们要先判断极端条件,比如任何一条链表为空都会让整个程序直接返回null; 然后我们需要考虑的是A和B链条不重合的节点数量是否相同,如果相同,那自然是万事大吉,几步遍历就找到了。可若是节点不同,那么我们可以观察到: 遍历完“A链表加上B链表的未重合部分”和“B链表加上A链表的未重合部分的距离是一样的”(这句话可以细品) 所以我们可以设置一个pA指针指向head...原创 2021-08-27 00:22:01 · 48 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 代码: class Solution { public int[] exchange(int[] nums) { int i = 0; int j = nums.length - 1; int temp; while(i < j){ while(i < nums.len原创 2021-08-24 00:38:28 · 57 阅读 · 0 评论 -
leetcode-11. 盛最多水的容器(双指针)
题目: 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0) 。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。 说明:你不能倾斜容器。 代码: class Solution { public int maxArea(int[] height) { int i = 0; int j = height.l...原创 2021-08-12 01:23:44 · 95 阅读 · 1 评论 -
剑指 Offer 06. 从尾到头打印链表
题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 代码: class Solution { public int[] reversePrint(ListNode head) { ListNode node = head; int count = 0; while(node!=null){ count++; node = node.next; }原创 2021-08-11 20:22:30 · 105 阅读 · 0 评论 -
剑指offer24.反转链表
还是老规矩话不多说直接上代码: class Solution { public ListNode reverseList(ListNode head) { ListNode pre = null, next; ListNode current = head; while(current != null){ next = current.next; current.next = pre;...原创 2021-08-11 20:17:02 · 42 阅读 · 0 评论