完全平方数
给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
示例 1:
**输入:**n = 12
**输出:**3
解释: 12 = 4 + 4 + 4
思路:动态规划
-
状态定义 :
dp[i]表示凑成和为i的最少完全平方数数量。 -
初始化 :
dp[0] = 0,其余初始化为一个较大值(如Integer.MAX_VALUE或n),因为要求最小值。 -
状态转移方程 :
对于每个和
i,我们可以遍历所有小于等于i的完全平方数j * j:dpi=min(dpi,dpi−j∗j+1)
意思是:凑成
i的最少数量,等于凑成i - j*j的最少数量加上当前这个平方数j*j(数量 +1)。 -
返回值 :
dp[n]。
class Solution {
public int numSquares(int n) {
int\[\] dp=new intn+1;
for(int i=1;i<=n;i++){
dpi=i;
}
dp0=0;
for(int i=1;i<=n;i++)
for(int j=1;j*j<=n;j++){
if(i>=j*j)
dpi=Math.min(dpi,dpi-j\*j+1);
}
return dpn;
}
}
打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例 1:
输入: 1,2,3,1
**输出:**4
**解释:**偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
class Solution {
public int rob(int\[\] nums) {
int n=nums.length;
int\[\] dp=new intn;
dp0=nums0;
if(n>=2)dp1=Math.max(nums0,nums1);
for(int i=2;i<=n-1;i++){
dpi=Math.max(dpi-1,dpi-2+numsi);
}
return dpn-1;
}
}
最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。可以使用Deque
实现 MinStack 类:
MinStack()初始化堆栈对象。void push(int value)将元素value推入堆栈。void pop()删除堆栈顶部的元素。int top()获取堆栈顶部的元素。int getMin()获取堆栈中的最小元素。
思路:维护一个数据栈,正常进行push,pop,top
维护一个最小栈,动态存储每一轮数据栈中的最小值
push:对于数据栈,value来了直接push,对于最小栈,如果最小栈为空或者当前value小于等于最小栈的栈顶,则将value也push进最小栈
pop:数据栈直接pop,pop时比较当前pop出去的值和当前最小栈顶的值,如果相等,要把最小栈顶的值也pop出去,进行状态的管理
class MinStack {
private Deque datastack;
private Deque minstack;
public MinStack() {
this.datastack=new ArrayDeque<>();
this.minstack=new ArrayDeque<>();
}
public void push(int value) {
datastack.push(value);
if(minstack.isEmpty()||value<=minstack.peek()){
minstack.push(value);
}
}
public void pop() {
if(datastack.pop().equals(minstack.peek())){
minstack.pop();
}
}
public int top() {
return datastack.peek();
}
public int getMin() {
return minstack.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(value);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/