2026-10-21学习笔记

完全平方数

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

示例 1:

**输入:**n = 12

**输出:**3

解释: 12 = 4 + 4 + 4

思路:动态规划

  1. 状态定义 :dp[i] 表示凑成和为 i 的最少完全平方数数量。

  2. 初始化 :dp[0] = 0,其余初始化为一个较大值(如 Integer.MAX_VALUE 或 n),因为要求最小值。

  3. 状态转移方程 :

    对于每个和 i,我们可以遍历所有小于等于 i 的完全平方数 j * j:

    dpi=min⁡(dpi,dpi−j∗j+1)

    意思是:凑成 i 的最少数量,等于凑成 i - j*j 的最少数量加上当前这个平方数 j*j(数量 +1)。

  4. 返回值 :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();

*/

相关推荐
蒸蒸yyyyzwd12 分钟前
从后端面经学到的 3 个知识
笔记·学习
17岁的勇气12 分钟前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
坤坤子吖44 分钟前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
lisw051 小时前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵
一起学安全技术2 小时前
拆大模型 03|注意力的一句话版本:不用论文讲清 Attention
深度学习·算法·语言模型·transformer
路灯上の马陈3 小时前
Java 内部类 学习笔记
笔记·学习
希和20273 小时前
51 单片机入门笔记:江科大课程代码逐行讲解(按键控制 LED 流水灯)
笔记·单片机·mongodb
前进的李工3 小时前
Agent 学习笔记 12:Agent 的工具应该怎么设计
人工智能·笔记·学习·agent·工具调用·skill·工具设计
Delightrs3 小时前
Rust LeetCode238 算法题解
开发语言·算法·rust
ever_you_love3 小时前
2026.11.9录屏笔记
笔记