the triangle java_[LeetCode] 120.Triangle Java

题目:

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

For example, given the following triangle

[

[2],

[3,4],

[6,5,7],

[4,1,8,3]

]

The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

Note:

Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.

题意及分析:给出一个三角形状的整数list,从第一行向下移动,每次只能向下一行相邻的数移动,要求求出从第一行到最后一行所经过的数字的和最小的方法。这是一道动态规划的题目,我首先想到的是用一个二维数组存储从第一行到某行某个数的经过数的最小值,这是空间为o(n*n),对其中第i行(i>1)的第j个数(0

代码:

public class Solution {

public int minimumTotal(List> triangle) {

int row=triangle.size();//行数

if(row==0) return 0;

int[][] res=new int[row][row];//记录从第一行到每个点的最小值

int minSum=Integer.MAX_VALUE;//记录最小的sum

List list0=triangle.get(0);//第1行只有一个数,

if(list0.size()==0)

return 0;

if(row==1)

return list0.get(0);

res[0][0]=list0.get(0);

for(int i=1;i

List list=triangle.get(i);

for(int j=0;j

if(j==0){

res[i][j]=res[i-1][j]+list.get(j);

}else if(j==list.size()-1){

res[i][j]=res[i-1][j-1]+list.get(j);

}else{

res[i][j]=Math.min(res[i-1][j-1],res[i-1][j])+list.get(j);

}

if(i==row-1){

if(minSum>res[i][j])

minSum=res[i][j];

}

}

}

return minSum;

}

}

这道题还可以使用0(n)空间求解,将三角形看成倒三角形即可,从后面的行求到前面的行,这样就可以用一个一维数组保存到当前行的某个数的最小和。代码如下:

public class Solution {

public int minimumTotal(List> triangle) {

int row=triangle.size();//行数

if(row==0) return 0;

int[] res=new int[row+1];//倒着求,求最后一行到第一行最小和,这样就可以用o(n)空间了

for(int i=row-1;i>=0;i--){

List list=triangle.get(i);

for(int j=0;j

res[j]=(Math.min(res[j+1],res[j])+list.get(j));    //最后一行的最小值就是当前数

}

}

return res[0];

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个Python的GUI程序,用于生成和绘制三角波,并对其进行FFT变换。你可以通过交互式的方式改变三角波的基本频率和幅度,并观察其对应的频域幅值谱的变化。 ```python import numpy as np import matplotlib.pyplot as plt import tkinter as tk from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg class FFTTriangleGUI: def __init__(self): self.fig, self.axs = plt.subplots(2, 1, figsize=(8, 6)) self.canvas = FigureCanvasTkAgg(self.fig, master=root) self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) self.freq_slider = tk.Scale(root, from_=1, to=20, resolution=0.1, orient=tk.HORIZONTAL, label='Frequency (Hz)', command=self.update_triangle) self.freq_slider.pack(side=tk.TOP, fill=tk.BOTH, padx=5, pady=5) self.amp_slider = tk.Scale(root, from_=0, to=1, resolution=0.01, orient=tk.HORIZONTAL, label='Amplitude', command=self.update_triangle) self.amp_slider.pack(side=tk.TOP, fill=tk.BOTH, padx=5, pady=5) self.freq = 5 self.amp = 0.5 self.update_triangle(None) def update_triangle(self, event): t = np.linspace(0, 1, 400, endpoint=False) x = np.concatenate((t, np.flip(t))) x -= np.mean(x) x *= self.amp x *= np.sin(2 * np.pi * self.freq * t) self.axs[0].clear() self.axs[0].plot(t, x[:len(t)]) self.axs[0].set_xlabel('Time (s)') self.axs[0].set_ylabel('Amplitude') self.axs[0].set_ylim((-1, 1)) X = np.fft.fft(x) freqs = np.fft.fftfreq(len(x)) * 400 self.axs[1].clear() self.axs[1].plot(freqs, np.abs(X)) self.axs[1].set_xlim((0, 20)) self.axs[1].set_xlabel('Frequency (Hz)') self.axs[1].set_ylabel('Magnitude') self.canvas.draw() if __name__ == '__main__': root = tk.Tk() root.title('FFT Triangle Wave Demo') FFTTriangleGUI() root.mainloop() ``` 运行程序后,将会弹出一个窗口,其中包含两个图,一个是三角波的时域波形,另一个是其对应的频域幅值谱。你可以通过拖动滑动条来改变三角波的基本频率和幅度。注意,频率轴的范围限制在0-20Hz之间,因此如果你将频率调整超过该范围,可能会看不到某些谐波分量的幅值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值