算法 & 面试
文章平均质量分 59
算法& 面试
c&0xff00
纸上学来终觉浅
展开
-
动态规划 (118杨辉三角)
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。示例 1:输入: numRows = 5输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:输入: numRows = 1输出: [[1]]提示:1 <= numRows <= 30Related Topics 数组 动态规划/** * 思路: * 动态规划,定义一个arr[numRows][.原创 2021-10-17 11:56:56 · 694 阅读 · 0 评论 -
多线程(H2O 生成、打印零与奇偶数)
1117. H2O 生成现在有两种线程,氧 oxygen 和氢 hydrogen,你的目标是组织这两种线程来产生水分子。存在一个屏障(barrier)使得每个线程必须等候直到一个完整水分子能够被产生出来。氢和氧线程会被分别给予 releaseHydrogen 和 releaseOxygen 方法来允许它们突破屏障。这些线程应该三三成组突破屏障并能立即组合产生一个水分子。你必须保证产生一个水分子所需线程的结合必须发生在下一个水分子产生之前。换句话说:如果一个氧线程到达屏障时没有氢线程到达,原创 2021-10-16 22:55:45 · 501 阅读 · 0 评论 -
二叉树、N叉树
429. N 叉树的层序遍历给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。示例 1:输入:root = [1,null,3,2,4,null,5,6]输出:[[1],[3,2,4],[5,6]]示例 2:输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,原创 2021-10-16 18:02:52 · 287 阅读 · 0 评论 -
递归(回溯算法)
递归算法的常用解题思路:1、写出递推公式2、确定递归出口3、根据递推公式写出代码589. N 叉树的前序遍历给定一个 N 叉树,返回其节点值的 前序遍历 。N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。进阶:递归法很简单,你可以使用迭代法完成此题吗?示例 1:输入:root = [1,null,3,2,4,null,5,6]输出:[1,3,5,6,2,4]示例 2:输入:root = [1,null,2,3,4,5,null,null原创 2021-10-09 23:45:22 · 304 阅读 · 0 评论 -
滑动窗口 - 无重复字符最长子串 字符串的排列子串
3. 无重复字符的最长子串给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: s = “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度原创 2021-09-21 14:31:10 · 170 阅读 · 0 评论 -
双指针 - 归并排序、移动元素、链表中点、链表中删除指定位置元素
977. 有序数组的平方给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。/示例 1:输入:nums = [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]示例 2:输入:nums = [-7,-3,2,3,11]输出:[4,9,9,49,121]提示:1 <= nums.length <= 104-原创 2021-09-17 19:42:43 · 243 阅读 · 0 评论 -
二分查找Java
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。示例 1:输入:n = 5, bad原创 2021-09-16 18:07:11 · 102 阅读 · 0 评论 -
矩阵
给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵,返回 true ;否则,返回 false 。如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。示例 1:输入:matrix = [[1,2,3,4],[5,1,2,3],[9,5,1,2]]输出:true解释:在上述矩阵中, 其对角线为:“[9]”, “[5, 5]”, “[1, 1, 1]”, “[2, 2, 2]”, “[3, 3]”, “[4]”。各条对角线上的所有元素均相.原创 2021-02-22 19:29:17 · 239 阅读 · 0 评论 -
485、最大连续1的个数 [数组遍历,双指针]
给定一个二进制数组, 计算其中最大连续1的个数。示例 1:输入: [1,1,0,1,1,1]输出: 3解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.注意:输入的数组只包含 0 和1。输入数组的长度是正整数,且不超过 10,000。思路1:遍历数组,用一个int变量记录ans,时间复杂度O(n)class Solution { public int findMaxConsecutiveOnes(int[] nums) { int a.原创 2021-02-15 17:28:39 · 137 阅读 · 0 评论 -
888、[数组]公平的糖果棒交换
爱丽丝和鲍勃有不同大小的糖果棒:A[i] 是爱丽丝拥有的第 i 根糖果棒的大小,B[j] 是鲍勃拥有的第 j 根糖果棒的大小。因为他们是朋友,所以他们想交换一根糖果棒,这样交换后,他们都有相同的糖果总量。(一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。)返回一个整数数组 ans,其中 ans[0] 是爱丽丝必须交换的糖果棒的大小,ans[1] 是 Bob 必须交换的糖果棒的大小。如果有多个答案,你可以返回其中任何一个。保证答案存在。示例 1:输入:A = [1,1], B = [2,2].原创 2021-02-01 10:36:53 · 108 阅读 · 0 评论 -
[字符串操作]给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。示例 1:输入: s1 = “abc”, s2 = “bca”输出: true示例 2:输入: s1 = “abc”, s2 = “bad”输出: false说明:0 <= len(s1) <= 1000 <= len(s2) <= 100Related Topics 数组 字符串边界条件:1、如果s1与s2是同一个对象,肯定相同2、s1与s原创 2021-01-22 11:13:47 · 3073 阅读 · 0 评论 -
[字符串操作] 确定一个字符串 s 的所有字符是否全都不同
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。示例 1:输入: s = “leetcode”输出: false示例 2:输入: s = “abc”输出: true限制:0 <= len(s) <= 100如果你不使用额外的数据结构,会很加分。Related Topics 数组看问题:首先,题目没有说字符的大小写要求,也没有说是26个字母,所以是比较通用的情况。边界判断:如果字符串为空或null或长度为1,肯定是不会重复的。或者假如是26个小写字原创 2021-01-22 10:51:07 · 1289 阅读 · 4 评论 -
✔[46]全排列(回溯) & ✔[47]全排列 II
回溯模板:result = []def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(路径, 选择列表) 撤销选择//给定一个 没有重复 数字的序列,返回其所有可能的全排列。//// 示例:// 输入: [1,2,3]//输出://[// [1,2,3],//原创 2020-09-10 14:12:22 · 171 阅读 · 0 评论 -
✔[39]组合总和 & [40]组合总和 II
//给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。//// candidates 中的数字可以无限制重复被选取。//// 说明:// 所有数字(包括 target)都是正整数。// 解集不能包含重复的组合。//// 示例 1:// 输入:candidates = [2,3,6,7], target = 7,//所求解集为://[// [7],// [2,2,3]//]//原创 2020-09-10 11:10:08 · 92 阅读 · 0 评论 -
✔[17]电话号码的字母组合
//给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。//// 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。//// 示例://// 输入:“23”//输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].//// 说明://尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。// Related Topics 字符串 回溯算法import java.util.Arr原创 2020-09-08 18:57:25 · 144 阅读 · 0 评论 -
✔[77]组合(回溯,DFS)
//给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。//// 示例://// 输入: n = 4, k = 2//输出://[// [2,4],// [3,4],// [2,3],// [1,2],// [1,3],// [1,4],//]// Related Topics 回溯算法通过深度搜索import java.util.ArrayDeque;import java.util.ArrayList;import java.util原创 2020-09-08 16:53:46 · 193 阅读 · 0 评论 -
3. 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。class So原创 2020-09-07 21:57:44 · 62 阅读 · 0 评论 -
验证回文字符串
思路:首先过滤转成char数组,然后进行比较,注意,这个方法有较大弊端。class Solution { public boolean isPalindrome(String s) { if(s==null||s.length()==1) return true; s = s.toLowerCase(); ...原创 2020-03-22 16:14:04 · 240 阅读 · 0 评论 -
反转字符串
思路:class Solution { public void reverseString(char[] s) { //交换的次数(这里不管长度是奇数还是偶数都不会有问题) int swapTimes = s.length >> 1; char temp; for(int i = 0;i<swap...原创 2020-03-22 15:12:36 · 187 阅读 · 0 评论 -
字符串压缩(字符串切分判断)
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。示例1: 输入:"aabcccccaaa" 输出:"a2b1c5a3"示例2: 输入:"abbccd" 输出:"abbccd" 解释:"a...原创 2020-03-20 09:49:06 · 270 阅读 · 0 评论 -
✔[146]LRU缓存机制
//运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。//// 获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1。//写入数据 put(key, value) - 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字/值」。当缓存容量达到上限时,它应该在//写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。//原创 2020-08-25 14:29:31 · 153 阅读 · 0 评论 -
反转单链表(迭代+递归)
class Solution { public ListNode reverseList(ListNode head) { if(head == null || head.next==null) return head; ListNode p = head; ListNode q = head.next; ListNo...原创 2020-03-23 11:19:23 · 472 阅读 · 0 评论 -
删除链表的倒数第N个节点
class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode p = head; int i; for(i = 0; i < n; i++) //用于判断链表长度 { p = p.nex...原创 2020-03-23 10:03:03 · 121 阅读 · 0 评论 -
买卖股票的最佳时机 II
思路:没买之前寻找买点,买了之后寻找卖点,自己写的代码很乱。class Solution { public int maxProfit(int[] prices) { int profit = 0; boolean hasBuy = false; int start = 0; int end = 0; ...原创 2020-03-22 14:32:17 · 163 阅读 · 0 评论 -
删除排序数组中的重复项
思路:1、原地删除重复数组元素,首先要找到重复元素,然后将后面的元素前移class Solution { public int removeDuplicates(int[] nums) { if(nums.length <=1) { return nums.length; } //找到重复元素 ...原创 2020-03-22 13:11:52 · 408 阅读 · 0 评论 -
✔[72]编辑距离
//给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。//// 你可以对一个单词进行如下三种操作://// 插入一个字符// 删除一个字符// 替换一个字符//// 示例 1:// 输入:word1 = “horse”, word2 = “ros”//输出:3//解释://horse -> rorse (将 ‘h’ 替换为 ‘r’)//rorse -> rose (删除 ‘r’)//rose -> ro原创 2020-08-03 15:54:44 · 83 阅读 · 0 评论 -
✔[5]最长回文子串
//给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。//// 示例 1:// 输入: “babad”//输出: “bab”//注意: “aba” 也是一个有效答案。//// 示例 2:// 输入: “cbbd”//输出: “bb”//// Related Topics 字符串 动态规划思路1:暴力求解,取出所有可能的字符串切分,判断是不是回文,嗯,没错,超时了class Solution { public String longestP原创 2020-07-31 12:39:43 · 64 阅读 · 0 评论 -
188.买卖股票的最佳时机 IV
//给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。//// 设计一个算法来计算你所能获取的最大利润。你最多可以完成== k 笔交易==。//// 注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。//// 示例 1:// 输入: [2,4,1], k = 2//输出: 2//解释: 在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。//// 示例 2:/原创 2020-07-30 19:04:36 · 138 阅读 · 0 评论 -
322.零钱兑换
//给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回// -1。//// 示例 1:// 输入: coins = [1, 2, 5], amount = 11//输出: 3//解释: 11 = 5 + 5 + 1//// 示例 2:// 输入: coins = [2], amount = 3//输出: -1//// 说明://你可以认为每种硬币的数量是无限的。// Rela原创 2020-07-30 08:57:12 · 143 阅读 · 0 评论 -
120.三角形最小路径和
//给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。// 相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。//// 例如,给定三角形://// [// [2],// [3,4],// [6,5,7],// [4,1,8,3]// ]//// 自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。//// 说明:// 如果你可以只使用 O(n) 的额外原创 2020-07-28 19:15:20 · 71 阅读 · 0 评论 -
152.乘积最大子数组
//给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。//// 示例 1:// 输入: [2,3,-2,4]//输出: 6//解释: 子数组 [2,3] 有最大乘积 6。//// 示例 2:// 输入: [-2,0,-1]//输出: 0//解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。// Related Topics 数组 动态规划思路1:暴力求解,递归思路2:动态规划class Sol原创 2020-07-23 14:50:55 · 62 阅读 · 0 评论 -
70.爬楼梯
//假设你正在爬楼梯。需要 n 阶你才能到达楼顶。//// 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?//// 注意:给定 n 是一个正整数。//// 示例 1:// 输入: 2//输出: 2//解释: 有两种方法可以爬到楼顶。//1. 1 阶 + 1 阶//2. 2 阶//// 示例 2:// 输入: 3//输出: 3//解释: 有三种方法可以爬到楼顶。//1. 1 阶 + 1 阶 + 1 阶//2. 1 阶 + 2 阶//3.原创 2020-07-23 14:05:42 · 72 阅读 · 0 评论 -
121. 买卖股票的最佳时机(动态规划)
给定一个数组,它的第i个元素是一支给定股票第i天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。...原创 2020-03-19 09:44:08 · 570 阅读 · 0 评论 -
122.买卖股票的最佳时机
//给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。//// 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。//// 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。//// 示例 1:// 输入: [7,1,5,3,6,4]//输出: 7//解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。// 随后,在第原创 2020-07-13 13:36:58 · 135 阅读 · 0 评论 -
通过队列的api实现栈的功能
使用队列实现栈的下列操作:push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是push to back,peek/pop from front,size, 和is empty这些操作是合法的。 你所使用的语言也许不支持队列。你可以使用 lis...原创 2020-03-20 10:48:04 · 97 阅读 · 0 评论 -
212.单词搜索II
//给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。//// 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。//// 示例:// 输入://words = [“oath”,“pea”,“eat”,“rain”] and board =//[// [‘o’,‘a’,‘a’,‘n’],// [‘e’,‘t’,‘a’,‘e’]原创 2020-07-22 16:03:51 · 169 阅读 · 0 评论 -
208.实现一个字典树(前缀树)
//实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。//// 示例:// Trie trie = new Trie();////trie.insert(“apple”);//trie.search(“apple”); // 返回 true//trie.search(“app”); // 返回 false//trie.startsWith(“app”); // 返回 true//trie.insert(“app”);/原创 2020-07-22 14:25:23 · 181 阅读 · 0 评论 -
102二叉树的层序遍历
//给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。//// 示例://二叉树:[3,9,20,null,null,15,7],//// 3// / // 9 20// / // 15 7//// 返回其层次遍历结果://// [// [3],// [9,20],// [15,7]//]//// Related Topics 树 广度优先搜索思路1:BFS,广度优先遍历,1、通过que原创 2020-07-21 10:20:41 · 150 阅读 · 0 评论 -
二叉树的最大深度
//给定一个二叉树,找出其最大深度。// 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。// 说明: 叶子节点是指没有子节点的节点。//// 示例://给定二叉树 [3,9,20,null,null,15,7],// 返回它的最大深度 3 。// Related Topics 树 深度优先搜索/**Definition for a binary tree node.public class TreeNode {int val;TreeNode left;TreeNode原创 2020-07-14 19:48:20 · 218 阅读 · 0 评论 -
二叉树的前序遍历
//给定一个二叉树,返回它的 前序 遍历。//// 示例:// 输入: [1,null,2,3]// 1// // 2// /// 3////输出: [1,2,3]//// 进阶: 递归算法很简单,你可以通过迭代算法完成吗?// Related Topics 栈 树import java.util.ArrayList;import java.util.Stack;/** * Definition for a binary tree node.原创 2020-07-13 14:47:50 · 160 阅读 · 0 评论