
leetcode
&orange
主要用于记录平时自己学到的东西,文章仅代表个人理解,有什么不对的地方,欢迎大家批评指正。
展开
-
单调栈题目总结
单调栈」顾名思义就是具有单调性的栈结构,一般常用于找到下一个更大的元素,即当前元素右侧第一个更大的元素。这个问题需要让我们求与下一个更大元素的间隔,所以我们稍微转变一下栈中存储的内容即可。为了节约空间,我们可以利用「模运算」实现 2 倍数组的效果,而不需要单独开辟空间。其实除了用两个栈,还可以用两个堆来实现,堆比栈更好理解,但是原理都是一样的!这个问题加入了一个循环数组的概念,我们处理的方法就是利用 2 倍的数组即可。我们只看得到比我们更高的元素,所以比我们矮的元素就无关紧要。的所有下一个更大元素,用。原创 2024-02-18 21:48:21 · 451 阅读 · 1 评论 -
贪心算法-题目
55. 跳跃游戏Difficulty: 中等给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例 2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃原创 2021-09-16 20:54:41 · 156 阅读 · 0 评论 -
动态规划题目
最大正方形在一个二维01矩阵中找到全为1的最大正方形, 返回它的面积.样例样例 1:输入:[ [1, 0, 1, 0, 0], [1, 0, 1, 1, 1], [1, 1, 1, 1, 1], [1, 0, 0, 1, 0]]输出: 4样例 2:输入:[ [0, 0, 0], [1, 1, 1]]输出: 1//思考用动态规划;dp[i][j]代表i,j为右下角最大正方形的边长。对于正方形来说;我们知道正方形要求四条边相等;如果matrix[i][j]=原创 2021-09-16 20:54:01 · 160 阅读 · 0 评论 -
不用加减乘除做加法
class Solution { public int add(int num1, int num2) { int sum = 0,carry = 0; do{ sum = num1^num2; carry = (num1 & num2)<<1; num1 = ...原创 2020-04-06 18:27:04 · 125 阅读 · 0 评论 -
重复的元素
一个数组长度为N,元素分别为0-到n-1;已经知道存在重复元素;返回重复元素;要求时间O(N);空间O(1); public int duplicate(int numbers[], int length, int [] duplication) { if (numbers == null || length == 0) { return false...原创 2020-04-07 15:49:07 · 676 阅读 · 0 评论 -
解码方法
一条包含字母 A-Z 的消息通过以下方式进行了编码:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。输入描述:12可以解码成“AB”,“L”这两种输出解码方法总数 public static int dpProcess(char[] str) { int len = str....原创 2020-03-27 18:04:27 · 254 阅读 · 0 评论 -
构造回文
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?输出需要删除的字符个数。思路1:将其转换为求最长公共子序列问题;import java.util.*;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) {原创 2020-06-03 23:41:29 · 149 阅读 · 0 评论 -
面试题- 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。要求 O(n)时间,O(1)空间;// public int majorityElement(int[] nums) { int x = 0, votes = 0; for(int num : nums){ if(votes == 0) x = num; ...原创 2020-04-06 17:18:51 · 157 阅读 · 0 评论 -
安排面试城市
今天有N个面试者需要面试,公司安排了两个面试的城市A和B,每一个面试者都有到A城市的开销costA和到B城市的开销costB。公司需要将面试者均分成两拨,使得total cost最小。样例输入: cost = [[5,4],[3,6],[1,8],[3,9]]输出: 14说明: 第一个和第二个人去B城市,剩下的去A城市说明题目要求去A的人数和去B的人数相等。注意事项N是偶数2&l...原创 2020-04-19 22:57:47 · 342 阅读 · 0 评论 -
二分法题目总结
34. 在排序数组中查找元素的第一个和最后一个位置Difficulty: 中等Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.If target is not found in the array, return [-1, -1].Follow up: Could you write an algorithm原创 2021-03-31 20:20:42 · 142 阅读 · 0 评论 -
实现 strStr()
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = “hello”, needle = “ll” 输出: 2 public int strStr(String haystack, String needle) { if(needle == "") return 0; int i = 0;原创 2020-06-15 19:52:07 · 168 阅读 · 0 评论 -
最大频率栈
实现 FreqStack,模拟类似栈的数据结构的操作的一个类。FreqStack 有两个函数: push(int x),将整数 x 推入栈中。pop(),它移除并返回栈中出现最频繁的元素。如果最频繁的元素不只一个,则移除并返回最接近栈顶的元素。push [5,7,5,7,4,5]pop() -> 返回 5,因为 5 是出现频率最高的。 栈变成[5,7,5,7,4]。pop() -> 返回 7,因为 5 和 7 都是频率最高的,但 7 最接近栈顶。 栈变成 [5,7,5,4]。p原创 2020-06-06 01:02:33 · 358 阅读 · 0 评论 -
位运算题目汇总
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。请你返回排序后的数组。输入:arr = [0,1,2,3,4,5,6,7,8]输出:[0,1,2,4,8,3,5,6,7]解释:[0] 是唯一一个有 0 个 1 的数。[1,2,4,8] 都有 1 个 1 。[3,5,6...原创 2020-05-01 18:09:52 · 426 阅读 · 0 评论 -
最小会议室安排
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[ s1 , e1 ] ,[ s2 , e2 ],…] (si < ei) ,为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排输入:[[0, 30],[5, 10],[15, 20]]输入:2思路:安装开始时间进行排序;然后利用最小堆;为何一个最小值;如果当前堆元素小...原创 2020-04-30 20:32:03 · 1164 阅读 · 0 评论 -
最小子树之和
给一棵二叉树, 找到和为最小的子树, 返回其根节点。输入输出数据范围都在int内。样例样例 1:输入:{1,-5,2,1,2,-4,-5}输出:1说明这棵树如下所示:1/ -5 2/ \ / 1 2 -4 -5整颗树的和是最小的,所以返回根节点1.public class Solution { /** * @param root...原创 2020-04-21 19:31:33 · 287 阅读 · 0 评论 -
删除链表当中重复元素
Input: 1->2->3->3->4->4->5Output: 1->2->5思路:比如1-2-3-3-4-5;比如;我们用p指针,当p.next.val==p.next.next.val;说明有重复值;此时p指向2;然后用一个val保存当前重复值;从第一个重复元素开始判断;然后p.next指向p.next.next; pub...原创 2020-04-16 19:52:42 · 177 阅读 · 0 评论 -
合并两个有序链表
输入:1->2->4, 1->3->4输出:1->1->2->3->4->4//非递归class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode dummy=new ListNode(0); ...原创 2020-04-16 12:20:36 · 122 阅读 · 0 评论 -
01矩阵
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 。示例 1:输入:0 0 00 1 00 0 0输出:0 0 00 1 00 0 0思路BFS;通过viiste数组标记元素是否访问过;将元素为0全部入队;标记置为True;然后队列出队;上下左右四个方向进行判断;如果没有访问过;并且合法;说明该值为1,然后将该值标记为...原创 2020-04-15 22:49:18 · 686 阅读 · 0 评论 -
Path_SumII问题
Example:Given the below binary tree and sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \7 2 5 1Return:[ [5,4,11,2], [5,8,4,5]]//class Solution { publi...原创 2020-04-14 13:35:31 · 90 阅读 · 0 评论 -
实现pow函数(快速幂实现)
思路:每一次计算,我们需要存储 x ^(2/n)的结果;通过这样降低时间复杂度;事项logN的时间复杂度class Solution {public: double fastPow(double x, long long n) { if (n == 0) { return 1.0; } double half = ...原创 2020-04-13 17:09:56 · 1621 阅读 · 0 评论 -
乘积最大连续子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字)输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。思路:维护一个最大值、最小值;每次碰到小于0的值;我们让min,max值进行交换;这样便能维持住当前最大值、最小值;这里比如2,3,-2,4;到-2的时候;此时最大6,min是3;显然此时如果计算到-2后;最大是...原创 2020-04-10 14:26:05 · 2573 阅读 · 0 评论 -
二个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )//思路:二个栈;当出队时候,用第二个栈push第一个栈中的元素;class CQueue { Stack<Integer> stack1; S...原创 2020-04-06 11:44:36 · 113 阅读 · 0 评论 -
数字在排序数组中出现的次数
统计一个数字在排序数组中出现的次数。例如输入排序数组[1, 2, 3, 3, 3, 3, 4, 5]和数字3,由于3在这个数组中出现了4次,因此输出4。样例 输入:[1, 2, 3, 3, 3, 3, 4, 5] , 3输出:4考虑二分来解决;标准二分,如果有重复值;返回的是最左边的元素下标;我们可以再次找寻key+1;这样,二者相减就得到key出现的次数;当然我们也可以重新改写二分...原创 2020-04-05 22:40:13 · 208 阅读 · 0 评论 -
leetcode -不同路径II
不同路径II从0,0点到右下角最多不重复路径;输入:[[0,0,0],[0,1,0],[0,0,0]]输出: 2解释:3x3 网格的正中间有一个障碍物。从左上角到右下角一共有 2 条不同的路径:1. 向右 -> 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右 -> 向右来源:力扣(LeetCode)链接:https:...原创 2020-04-04 13:28:36 · 135 阅读 · 0 评论