每日一题
算法题
龙灬马
这个作者很懒,什么都没留下…
展开
-
每日一题—— 无重叠区间
无重叠区间:给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。思路:先对数组按右边界进行排序,从最小的右边界开始与下一个的左边界进行比较,如果大于则i++,如果小于则交换边界,并且count++。 public int eraseOverlapIntervals(int[][] intervals) { if(intervals.length == 0) return 0;原创 2022-03-29 23:18:03 · 210 阅读 · 0 评论 -
每日一题——分发糖果
分发糖果:n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。思路:先从前向后确定右孩子大于左孩子的情况,再从后先前确定左孩子大于右孩子的情况。如果从两边一起考虑会顾此失彼。public int candy(int[] ratings) { int[] array = new int[rat原创 2022-03-27 15:05:04 · 745 阅读 · 0 评论 -
每日一题——加油站&&K 次取反后最大化的数组和
加油站:在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。思路:局部:收益大于0的才能作为起点,且连续多个站看作一个整体时收益一样大于0,整体:总收益大于等于0.K 次取反后最大化的数原创 2022-03-25 16:38:13 · 146 阅读 · 0 评论 -
每日一题——跳跃游戏&&跳跃游戏 II
跳跃游戏:给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。思路:局部最优:每次取最大跳跃步数(最大覆盖范围)。整体最优:最后得到最大覆盖范围,判断是否能到达终点。跳跃游戏 II:给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。思路:移动下标只要遇到当前原创 2022-03-24 16:06:07 · 3605 阅读 · 0 评论 -
每日一题——最大子序和&&买卖股票的最佳时机II
最大子序和:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。思路: 局部最优:当前连续和为负数的时候立刻放弃,从下一个元素重新计算连续和,因为负数加上下一个元素连续和只会越来越小。全局最优:选取最大连续和买卖股票的最佳时机II:给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格。在每一天,你可能会决定购买和/或出售股票。你在任何时候 最多 只能持有一股股票。你也可以购买它,然后在同一原创 2022-03-23 15:32:34 · 70 阅读 · 0 评论 -
每日一题——分发饼干&&摆动序列
分发饼干:假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。思路:优先满足胃口大的,这里的局部最优解就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优解就是喂饱尽可能多的小孩摆动序列原创 2022-03-22 15:15:21 · 382 阅读 · 0 评论 -
每日一题——盛最多水的容器
题目:盛最多水的容器给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。思路:使用两个指针分别指向 l:height[0]与 r: height[length - 1],相向移动,比较l与r指向的值的大小,两个的较大值 *(r-l),并记录,如果l指向的值小于r指向的值,则指针l向右移动,反之,r向左移动,重复以上操作直原创 2022-03-21 14:34:57 · 247 阅读 · 0 评论 -
每日一题——字符串相乘
题目:字符串相乘要求:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。不能使用任何内置的 BigInteger 库或直接将输入转换为整数。public String multiply(String num1, String num2) { int n1 = num1.length()-1; int n2 = num2.length()-1; if(n1原创 2022-03-20 16:27:52 · 335 阅读 · 0 评论 -
每日一题——搜索插入位置
搜索插入位置题目:输入一个排序的整数数组nums和一个目标t,如果数组中包含t,则返回t的下标,如果数组nums中不包含t,则返回将t按顺序插入数组中的下标。思路:使用二分查找的思想。public int searchInsert(int[] nums, int target){ //O(log n) int left = 0, right = nums.length - 1; while (left <= right){ int mid原创 2022-03-19 15:29:46 · 229 阅读 · 0 评论 -
每日一题——最多删除一个字符得到回文
最多删除一个字符得到回文题目:给定一个字符串,请判断如果最多从字符串中删除一个字符能不能得到一个回文字符串。思路:从两端开始向里逐步比两个字符是不是相同,如果相同,则继续移动继续比较,如果不相同,按照要求删除一个字符之后再比较其他两个字符就能形成一个回文。public boolean validPalindrome(String s){ int start = 0; int end = s.length() - 1; for (; start <原创 2022-03-18 14:30:53 · 352 阅读 · 0 评论 -
每日一题——有效回文
有效回文题目:给定一个字符串,请判断它是不是回文,假设只考虑字母和数字字符,并忽略大小写。思路:使用双指针,一个指向第一个字符,一个指向最后一个字符,相向移动,如果两个指针指向的字符相同,则同时移动这两个指针以判断他们指向的下一个字符是否相同。知道这两个指针相遇。可能用到的方法:Character.isLetter(ch) 判断ch是否为字母Character.isDigit(ch) 判断ch是否为数字Character.isLetterOrDigit(ch) 判断ch是否为数字或字母C原创 2022-03-17 16:42:38 · 57 阅读 · 0 评论 -
每日一题——不含重复字符的最长子字符串
不含重复字符的最长子字符串题目:输入一个字符串,求该字符串中不含重复字符的最长子字符的长度。ASCII码总共有256个字符,因此用来模拟数组的长度就是256. public int lengthOfLongestSubstring(String s){ //哈希表统计子字符串 if(s.length() == 0){ return 0; } int[] counts = new int[256]; int i =原创 2022-03-16 13:03:34 · 93 阅读 · 0 评论 -
每日一题——两个数字之和
排序数组中的两个数字之和思路:O(n):O(n^2):public int[] twoSum(int[] numbers, int target){ //O(n) int i = 0; int j = numbers.length - 1; while(i < j && numbers[i] + numbers[j] != target){ if (numbers[i] + numbers[j] <原创 2022-03-15 16:16:14 · 80 阅读 · 0 评论 -
每日一题——整数除法
整数除法题目:输入两个int类型整数,它们进行除法运算并返回商,要求不得使用“*”,“/”,“%”,当发生溢出时,返回最大的整数值。假设除数不能为0。解题思路:O(n):循环地从被除数里面减去除数,当最后一步被除数减去除数小于0时,循环次数就是结果。O(log n):对上述的解法进行优化,当被除数大于除数时,比较判断被除数是否大于除数的2倍,如果是,继续判断被除数是否大于除数的4倍,8倍等等。如果被除数最多大于除数的2^k倍,将被除数减去除数的2的k次方倍,然后重复刚才的步骤。最终的次数=第一次的倍原创 2022-03-14 16:27:56 · 564 阅读 · 0 评论 -
每日一题——最后一个单词的长度
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。示例 1:输入:s = “Hello World”输出:5示例 2:输入:s = " fly me to the moon "输出:4示例 3:输入:s = “luffy is still joyboy”输出:6//public static int lengthOfLastWord(String s) {原创 2021-10-22 14:48:52 · 70 阅读 · 0 评论