找工作(有序表) 为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。输入描述:每个输入包含一个测试用例。每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(
线段树 - java通用模板 LeetCode-307线段树是一种非常灵活的数据结构,它可以用于解决多种范围查询问题,比如在对数时间内从数组中找到最小值、最大值、总和、最大公约数、最小公倍数等。数组 A[0,1,…,n−1] 的线段树是一个二叉树,其中每个节点都包含数组的一个子范围 [i…j] 上的聚合信息(最小值、最大值、总和等),其左、右子节点分别包含范围 [i … (i+j)/2]和 [(i+j)/2 + 1, j]上的信息。class NumArray { public interface Merger<E
字符串分割 题目描述给定一个由若干a和b组成的字符串s,请你计算并返回将该字符串分割成两个非空子字符串(即左子字符串和右子字符串)所能获得的最大得分。【分割字符串的得分】为左子字符串中a的数量加上右子字符串中b的数量。分析设计一道典型的前缀和题目,分别计算左边a的数量和右边b的数量,然后计算各个下标的得分取最大值。代码实现public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * @param str
Java代码块 public class ConstructorTest1 { {//构造代码块 System.out.println("执行构造代码块"); } public ConstructorTest1() { System.out.println("执行无参构造函数"); } public ConstructorTest1(String string) { System.out.println("执行有参构造函数");
Leetcode_32.最长有效括号 解题思路:结合题目,有最长这个字眼,可以考虑尝试使用动态规划进行分析。这是一个最值型动态规划的题目。动态规划题目分析的 4 个步骤:确定状态 研究最优策略的最后一步 化为子问题转移方程 根据子问题定义得到初始条件和边界情况计算顺序首先,我们定义一个 dp[] 数组,其中第 i 个元素表示以下标为 i 的字符结尾的最长有效子字符串的长度。确定状态:最后一步:对于最优的策略,一定有最后一个元素 s[i].所以,我们先看第 i 个位置,这个位置的元素 s[i] 可能
Leetcode_674 最长连续递增序列 给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[ i ] < nums[i + 1] ,那么子序列 [nums[ l ], nums[l + 1], …, nums[r - 1], nums[ r ]] 就是连续递增子序列。0 ≤ nums.length ≤104−109 ≤ nums[ i ] ≤ 109示例1:输入:nums =
删除有序数组中的重复项 给你一个有序数组 nums ,请你原地 删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝int len = removeDuplicates(nums)
计算校验码 【问题描述】传送一个B(B≤16)进制的数值N时,最后加上一个一位(B进制的)校验码,使得N加上校验位后能被B-1整除。比如十进制的数值12310,其校验码就是3,因为十进制数值123310能被9整除。16进制的数7816,其校验码为0,因为16进制的78016是15的倍数。超过十进制后,用字母a表示10,字母b表示11,字母c表示12,字母d表示13,字母e表示14,字母f表示15。告诉你进制B,以及一个B进制的正整数N,要求你计算正整数N在B进制下的校验码。【输入形式】输入第一行正整数t (10
可删除的点 【问题描述】平面上有n个不同的点,没有在Y轴的点,检查是否存在这样一个点,将其删除后其余所有的点均位于Y轴的同一边。【输入形式】输入第一行包含一个正整数n(2<=n<=105)。接下来的n行,包含所有点的坐标,第i行包含两个整数xi和yi(|xi|、|yi|<=109,xi<>0)。【输出形式】如果存在这样的点,则输入"Yes",否则输出"No"。【样例输入】31 1-1 -12 -1【样例输出】Yes**易错点:**只考虑到y轴某一侧有且仅有一个点
循环数 【问题描述】循环数是n位长度的整数,当乘以从1到n的任何整数时,产生原始数字的“循环”。也就是说,如果考虑最后一个数字之后的数字“绕”回到第一个数字,两个数字中的数字序列将是相同的,尽管它们可能从不同的位置开始。例如,数字142857是循环的,如下表所示: 142857 *1 = 142857 142857 *2 = 285714 142857 *3 = 428571 142857 *4 = 571428 142857 *5 = 714285 142857
电能消耗 【问题描述】汤姆对他最喜欢的笔记本电脑的耗电量很感兴趣。他的笔记本电脑有三种模式。在正常模式下,笔记本电脑每分钟消耗P1瓦。在汤姆最后一次移动鼠标或触摸键盘后的T1分钟,屏幕保护程序启动,每分钟的功耗变化为P2瓦。最后,从屏幕保护程序启动到T2分钟后,笔记本电脑切换到“睡眠”模式,每分钟消耗P3瓦。 当笔记本电脑处于第二或第三模式时,如果汤姆移动鼠标或触摸键盘,则切换到第一种(正常)模式。 汤姆使用笔记本电脑工作的时间可以分为n个时间间期[l1, r1]、[l2, r2]、…、[ln, rn]。在每个间期
字符串逆序数排序 【问题描述】定义一个字符串的无序度为所有位置后面的字母比该位置的字母小的总数之和。比如"DAABEC’'这个字符串的无序度是5,因为D后面有4个位置比它小(AABC),E后面有1个比它小(C),其它位置后面没有比自己小的。" AACEDGG “的无序度为1(E后面有一个D比它小)。” ZWQM "的无序度为6,每个位置后面所有的字母都比它小。现在你的任务是给定一些字符串(只由大写字母组成),把他们按照无序度从小到大排序,如果无序度一样,那么就按照输入的相对顺序排序。【输入形式】单组测试数据。第一行有
开关与灯 【问题描述】给定n个开关和m个灯,第i个开关只能打开部分灯。矩阵a包含n行m列,当aij=1时表示开关i可以打开灯j,否则aij=0。开始时所有的m个灯都是关着的。开关只能从状态"关"到"开"。这意味着,对于每个可以打开某个灯的开关,无论你按多少次,这个灯都是开的。确保当你按下所有开关时,所有的灯都能打开,考虑是否可以忽略其中某个开关也能打开所有的灯。你的任务是确定是否存在这样的开关可以忽略,而使用其余的n-1个开关来打开所有m个灯。【输入形式】输入第1行包含两个整数n和m(1<=n, m&l
Java TreeSet有序集合 TreeSet存入数据后自动调用元素的compareTo(Object obj) 方法,自动对数据进行排序,所以输出的数据是经过排序(升序)的数据。注:compareTo方法返回值有:负数,零,正数。分别表示小于,等于,大于对于存入自定义的对象元素,要重写元素的public int compareTo(Object obj)方法元素定义时,需要实现Comparable接口import java.util.Iterator;import java.util.TreeSet;public cla
电话号码 【问题描述】Vasya有几本电话簿,记录了他的朋友们的电话号码,每一个朋友都可以有一或几个电话号码。Vasya决定整理关于朋友电话号码的信息。给定n个字符串,来自于Vasya的电话簿中的条目。每一条都以朋友的姓名开头,然后跟着当前条目中的电话号码个数,然后是本人的电话号码。有可能几个相同的电话被记录在同一个记录中。Vasya还认为,如果电话号码a是电话号码b的后缀(也就是说,号码b以a结尾),这两个号码被当作同一个电话号码,那么a被认为是无城市代码,它不应该被考虑。输出整理后Vasya朋友的电话号码
二叉树遍历,从前序、中序到后序 【问题描述】二叉树是一种非常重要的数据结构,非常多其他数据结构都是基于二叉树的基础演变而来的。对于二叉树,深度遍历有前序、中序以及后序三种遍历方法。三种基本的遍历思想为:前序遍历:根结点 —> 左子树 —> 右子树中序遍历:左子树—> 根结点 —> 右子树后序遍历:左子树 —> 右子树 —> 根结点比如,求以下二叉树的各种遍历前序遍历:1 2 4 5 7 8 3 6中序遍历:4 2 7 5 8 1 3 6后序遍历:4 7