题目:有一个会议时间安排的二维数组,每个会议时间包括开始和结束之间[start, end]
,每个会议需要一间会议室,返回所需会议室的最小数量
[[0, 30], [5, 10], [15, 20]]
输出2
贪心,参考贪心算法的区间问题,不重叠的区间可以使用一间会议室,因此需要找出每个时间段重叠的区间数的最大值
class Solution {
public int numSquares(int n) {
//动态规划,定义dp[n]表示和为n的最小平方数个数
int[] dp = new int[n + 1];
dp[0] = 0; //初始化(dp[16]应为0 + 1 = 1)
//遍历1到根号n,dp[n]为dp[n-j^2]中的最小值
for(int i = 1; i <= n; i++){
int res = i; //最大个数为i,即i个1相加
for(int j = 1; j * j <= i; j++){
res = Math.min(res, dp[i - j * j]);
}
dp[i] = res + 1;
}
return dp[n];
}
}
class Solution {
public void moveZeroes(int[] nums) {
//快慢指针,之前做过
int slow = 0;
//快指针遍历数组,将不为0的数移动到慢指针位置,每移动一次,慢指针递增
for(int fast = 0; fast < nums.length; fast++){
if(nums[fast] != 0){
nums[slow] = nums[fast];
slow++;
}
}
//最后补0
for(int i = slow; i < nums.length; i++){
nums[i] = 0;
}
}
}
i->nums[i]
的映射关系。注意:需要从环外位置开始遍历才能找到环的入口,共有n+1
个数字,范围是1到n,下标从0到n,因此从0开始遍历。
class Solution {
public int findDuplicate(int[] nums) {
//快慢指针,构建i->nums[i]的映射关系
//注意:需要从环外位置开始遍历才能找到环的入口,共有n+1个数字,范围是1到n,下标从0到n,因此从0开始遍历
int slow = 0;
int fast = 0;
//判断是否有环,确认相遇位置
fast = nums[nums[fast]];
slow = nums[slow];
while(slow != fast){
fast = nums[nums[fast]];
slow = nums[slow];
}
//判断环入口
int head = 0;
while(head != slow){
head = nums[head];
slow = nums[slow];
}
return head;
}
}
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if(root == null) return "";
//层序遍历
StringBuilder sb = new StringBuilder();
ArrayList<String> arr = new ArrayList<>();
Queue<TreeNode<