Leetcode 969.煎饼排序
题目给定数组 A,我们可以对其进行煎饼翻转:我们选择一些正整数 k <= A.length,然后反转 A 的前 k 个元素的顺序。我们要执行零次或多次煎饼翻转(按顺序一次接一次地进行)以完成对数组 A 的排序。
返回能使 A 排序的煎饼翻转操作所对应的 k 值序列。任何将数组排序且翻转次数在 10 * A.length 范围内的有效答案都将被判断为正确。
示例 1:123456789输入:[3,2,4,1]输出:[4,2,4,3]解释:我们执行 4 次煎饼翻转,k 值分别为 4,2,4,和 3。初始状态 A = [3, 2, 4, 1]第一次翻转后 (k=4): A = [1, 4, 2, 3]第二次翻转后 (k=2): A = [4, 1, 2, 3]第三次翻转后 (k=4): A = [3, 2, 1, 4]第四次翻转后 (k=3): A = [1, 2, 3, 4],此时已完成排序。
示例 2:12345输入:[1,2,3]输出:[]解释:输入已经排序,因此不需要翻转任何内容。请注意,其他可能的答案,如[3,3],也将被接受。
思路煎饼反转就是以数组中心索引位置为轴,两两 ...
JVM如何回收对象
如何判断对象是否要回收?对象回收的依据——是否被有效引用?引用的可分为强引用(Strong Reference)——指向new 对象的引用、软引用(Soft Reference)——有用但没必要的引用、弱引用(Weak Reference)——没有必要的引用、虚引用(Phantom Reference)——为了在对象被回收时获得系统通知。
强引用只要存在就不回收;软引用只有在内存即将不足的情况下才回收;弱引用及虚引用随便回收。
怎么判断对象是否被有效引用?
引用计数法。如果对象的引用计数器为0,则表示该对象可以回收。但是存在互相引用无法清理的情况。
可达性分析法。通过创建一个成为“GC Root”的对象作为搜索根节点,向下搜索。如果对象到该对象之间没有引用链关联,则该对象可回收。
对象死亡的判决书再对象确定没有引用的情况下,还需要判断其finalize方法没有被覆盖或者已经被执行一次(该方法只能执行一次),满足这两个条件,GC才会回收该对象。
如果finalize方法被覆盖,则将该对象加入一个 “F-Queue”队列中,由虚拟机创建的、优先级低的Finalizer的线程去处理 ...
Leetcode 638.大礼包
题目在LeetCode商店中, 有许多在售的物品。
然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品。
现给定每个物品的价格,每个大礼包包含物品的清单,以及待购物品清单。请输出确切完成待购清单的最低花费。
每个大礼包的由一个数组中的一组数据描述,最后一个数字代表大礼包的价格,其他数字分别表示内含的其他种类物品的数量。
任意大礼包可无限次购买。
示例1:1234567输入: [2,5], [[3,0,5],[1,2,10]], [3,2]输出: 14解释: 有A和B两种物品,价格分别为¥2和¥5。大礼包1,你可以以¥5的价格购买3A和0B。大礼包2, 你可以以¥10的价格购买1A和2B。你需要购买3个A和2个B, 所以你付了¥10购买了1A和2B(大礼包2),以及¥4购买2A。
示例2:1234567输入: [2,3,4], [[1,1,0,4],[2,2,1,9]], [1,2,1]输出: 11解释: A,B,C的价格分别为¥2,¥3,¥4.你可以用¥4购买1A和1B,也可以用¥9购买2A,2B和1C。你需要买1A,2B和1C,所以你付了¥4买了1A和1B(大礼包1),以及 ...
Java 运行时数据区域
定义Java虚拟机把所管理的内存划分为不同的区域,总称为运行时数据区域。
数据区域用途各不相同,有的随虚拟机启动而存在,有的随线程的生命周期存在。
根据《Java虚拟机规范(Java SE7版)》规定,Java虚拟机将数据区域划分为:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区(运行时常量池)。
程序计数器• 线程私有,每个线程都有一个用来记录字节码执行位置。
• 一块内存区域,java虚拟机规范中唯一没有规定OutOfMemoryError的区域。
• java字节码解释器通过改变计数器的值实现分支、跳转、循环、异常处理、线程恢复等操作。
• 如果执行的是Java方法,则存储的是虚拟机字节码指令地址;如果是Native方法,则存储为空。
Java虚拟机栈• 所谓的栈内存指的就是Java虚拟机栈。
• Java方法的运行,都会生成一个栈帧,用来存储执行Java方法的局部变量、操作数栈、动态链接、方法出口等信息。
• 一个Java方法的执行到结束,对应为一个栈帧的出栈与入栈。
• 虚拟机栈可以为固定内存,也可动态扩展。如果线程请求栈深度大于虚拟机深度,则会报StackO ...
Leetcode 1046.最后一块石头的重量
题目有一堆石头,每块石头的重量都是正整数。
每一回合,从中选出两块最重的石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。
提示121 <= stones.length <= 301 <= stones[i] <= 1000
思路(排序 -> 选最大及第二大做差 -> 更新数组 -> 排序)(循环 length-1 次) ->最大的为结果
代码1234567891011class Solution { public int lastStoneWeight(int[] stones) { int len = stones.length; for(int i=len-1; i>=1; i--){ ...
Leetcode 647.回文子串
题目给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
示例1:123输入: "abc"输出: 3解释: 三个回文子串: "a", "b", "c".
示例2:123输入: "aaa"输出: 6说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".
注意:1输入的字符串长度不会超过1000。
思路 + 代码回文子串的内部一定是回文子串,因此关键在于重复利用回文子串已经统计过的数值。
可采用双指针由回文子串向两端同时检测的方法。
分为偶数回文子串与奇数回文子串。
123456789101112131415161718class Solution { private int sum = 0; public int cou ...
Leetcode 983.最低票价
题目在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。
火车票有三种不同的销售方式:
一张为期一天的通行证售价为 costs[0] 美元;一张为期七天的通行证售价为 costs[1] 美元;一张为期三十天的通行证售价为 costs[2] 美元。通行证允许数天无限制的旅行。 例如,如果我们在第 2 天获得一张为期 7 天的通行证,那么我们可以连着旅行 7 天:第 2 天、第 3 天、第 4 天、第 5 天、第 6 天、第 7 天和第 8 天。
返回你想要完成在给定的列表 days 中列出的每一天的旅行所需要的最低消费。
示例1:12345678输入:days = [1,4,6,7,8,20], costs = [2,7,15]输出:11解释: 例如,这里有一种购买通行证的方法,可以让你完成你的旅行计划:在第 1 天,你花了 costs[0] = $2 买了一张为期 1 天的通行证,它将在第 1 天生效。在第 3 天,你花了 costs[1] = $7 买了一张为期 7 天 ...
Leetcode 11.盛最多水的容器
题目给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明: 你不能倾斜容器,且 n 的值至少为 2。
思路 + 代码方法1:暴力破解法
即遍历所有情况,找到最优解。
123456789101112class Solution { public int maxArea(int[] height) { int len = height.length; int res = 0; for(int i=1; i<len; i++){ for(int j=0; j<i; j++){ res = Math.max((i-j)*Math.min(height[i], height[j]),res); } ...
Leetcode 347.前K个高频元素
题目给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例1:12输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]
示例2:12输入: nums = [1], k = 1输出: [1]
说明:12你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
思路首先用一个HashMap统计不同数字出现的次数。
然后用一个最小堆维护k大小的结果。
这里采用java的优先队列 PriorityQueue 去维护最小堆。
这里需要注意的一点是比较器的设计,部分源代码如下:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162public boolean add(E e) { return offer(e); }public boolean of ...
Leetcode 739.每日温度
题目根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。
思路+代码最简单的思路,两次循环。
1234567891011121314151617class Solution { public int[] dailyTemperatures(int[] T) { int len = T.length; int[] results = new int[len]; for(int i=0; i<len-1; i++){ int tmp = 0; for(int j=i+1 ...