目录
253-会议室(..)
279-完全平方数
class Solution {
public int numSquares(int n) {
int[] f = new int[n+1];
for(int i=1;i<=n;i++){
int min = Integer.MAX_VALUE;
for(int j=1;j*j<=i;j++){
min = Math.min(min,f[i-j*j]);
}
f[i] = min + 1;
}
return f[n];
}
}
283-移动0
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
class Solution {
public void moveZeroes(int[] nums) {
if(nums==null||nums.length==0) return;
//双指针,标记0的位置,用来交换
int j =0;
for(int i=0;i<nums.length;i++){
//不等于0则j后移,直到当前位置nums[i]=0
if(nums[i]!=0){
//i,j不在同一位置时(i是一定大于或者等于j的)
if(i!=j){
nums[j] = nums[i];
nums[i] = 0;
}
j++;
}
}
}
}
287-寻找重复的数
给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。
假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。
你设计的解决方案必须不修改数组 nums 且只用常量级 O(1) 的额外空间。
示例 1:
输入:nums = [1,3,4,2,2]
输出:2
示例 2:输入:nums = [3,1,3,4,2]
输出:3
我们将:0 看作指针,指向 nums[0]
,而 nums[0]
也是指针,指向 nums[nums[0]]
.
如[1,3,1,2]: 0-->1-->3-->2-->1-->3-->2-->1-->3-->2....就形成了环
注意::这里之所以能够成环是因为“其数字都在 1 到 n 之间(包括 1 和 n)”,也就是说必定有重复的数
如果没有重复的数,如:数组 [1,4,3,2] 0-->1-->4-->null 就会超出界线
class Solution {
public int findDuplicate(int[] nums) {
int fast = 0;
int slow = 0;
//注意slow的写法,它走两步才是 slow = nums[nums[slow]];
//也就是相当于fast走两步,slow走一步
//slow = nums[slow];
//fast = nums[nums[fast]];
//注意如果这里写slow !=fast,就不能都把fast和slow放在0的位置
//while(slow !=fast){
while(true){
slow = nums[slow];
//环形链表中还需要判断nums[fast]是否为空
fast = nums[nums[fast]];
if(slow == fast) break;
}
slow = 0;
while(slow!=fast){
slow = nums[slow];
fast = nums[fast];
}
return slow;
}
}
297-二叉树的序列化和反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
//层次遍历,依次增加节点即可
//初始化可变字符串
StringBuilder string = new StringBuilder();
//注意::返回空字符串
if(root==null) return "";
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode tempNode = queue.poll();
if(tempNode!=null){
string.append(String.valueOf(tempNode.val));
//不用判断是否为空
//1 2 3 null null 4 5
queue.offer(tempNode.left);
queue.offer(tempNode.right);
}else{
string.append("null");
}
string.append(",");
}
return string.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data=="") return null;
//分离字符
String[] dataList = data.split(",");
System.out.print(dataList[0]);
TreeNode root = new TreeNode(Integer.parseInt(dataList[0]));
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
//下标
int index = 1;
//依次进队把节点连接成树
//队列中依次进入的:根 左 右 左 右...,只需要依次进队,然后左,右连接即可
while(!queue.isEmpty()){
TreeNode node = queue.poll();
//判断左节点
if(!"null".equals(dataList[index])){
node.left = new TreeNode(Integer.parseInt(dataList[index]));
queue.offer(node.left);
}
index++;
//判断右节点
if(!"null".equals(dataList[index])){
node.right = new TreeNode(Integer.parseInt(dataList[index]));
queue.offer(node.right);
}
index++;
}
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));