動態規劃/貪心算法

一、動態規劃

動態規劃?是一種用于解決優化問題的算法設計技術,尤其適用于具有重疊子問題和最優子結構性質的問題。它通過將復雜問題分解為更簡單的子問題,并保存這些子問題的解以避免重復計算,從而提高效率。

動態規劃的核心思想

  1. 最優子結構(Optimal Substructure)

    • 一個問題的最優解可以通過其子問題的最優解來構造。
    • 比如在最短路徑問題中,從起點到終點的最短路徑可以由起點到某個中間點的最短路徑和該中間點到終點的最短路徑組合而成。
  2. 重疊子問題(Overlapping Subproblems)

    • 在遞歸求解過程中,相同的子問題會被多次求解。
    • 動態規劃通過存儲子問題的解來避免重復計算,通常使用數組或哈希表等數據結構來存儲這些解。

1.算法原理

1)狀態表示

dp表(一維數組? 填滿該表其中某一個值就是結果 數組中某個數據值的意義就是狀態表示)

通過題目要求 經驗? 分析問題發現重復子問題 來創建dp表

2)狀態轉移方程

dp[i]等于什么?

3)初始化

根據狀態轉移方程填表,保證填表的時候不越界

4)填表順序

為了填寫當前狀態的時候,所需要的狀態已經計算過了

5)返回值

題目要求+狀態表示

2.例題

泰波那契序列?Tn?定義如下:?

T0?= 0, T1?= 1, T2?= 1, 且在 n >= 0?的條件下 Tn+3?= Tn?+ Tn+1?+ Tn+2

給你整數?n,請返回第 n 個泰波那契數?Tn?的值。

示例 1:輸入:n = 4 輸出:4? ??解釋: T_3 = 0 + 1 + 1 = 2 T_4 = 1 + 1 + 2 = 4

狀態表示:dp[i]第i個泰波那契數的值

狀態轉移方程:dp[i]=dp[i-1]+dp[i-2]+dp[i-3];

初始化:dp[0]=0;dp[1]=1;dp[2]=1

填表順序:從左向右

返回值:dp[n]

JAVA代碼

class Solution {public int tribonacci(int n) {
if(n==0) return 0;
if(n==1||n==2) return 1;
int[] dp=new int[n+1];
dp[0]=0;dp[1]=1;dp[2]=1;
for(int i=3;i<=n;i++){dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
}
return dp[n];}
}

3.空間優化

求解某個狀態時僅需要其的前幾個狀態

一定要確定好賦序

int tribonacci(int n){
//空間優化 滾動數組
if(n==0) return 0;
if(n==1||n==2) return 1;
int a=0;int b=1,c=1;int d=0;
for(int i=3;i<=n;i++){d=a+b+c;a=b;b=c;c=d;}
return d;
}

?二、貪心算法

1.算法原理:

局部最優->全局最優

把解決問題的過程分為若干步,解決每一步的時候都選擇當前看起來最優的解

希望得到全局最優解

但貪心算法并不總是保證全局最優解

2.例題

給定一個數組?prices?,它的第?i?個元素?prices[i]?表示一支給定股票第?i?天的價格。

你只能選擇?某一天?買入這只股票,并選擇在?未來的某一個不同的日子?賣出該股票。設計一個算法來計算你所能獲取的最大利潤。

示例 1:

[7,1,5,3,6,4]
輸出:5
解釋:在第 2 天(股票價格 = 1)的時候買入,在第 5 天(股票價格 = 6)的時候賣出,最大利潤 = 6-1 = 5 。注意利潤不能是 7-1 = 6, 因為賣出價格需要大于買入價格;同時,你不能在買入前賣出股票。

示例 2:

輸入:prices = [7,6,4,3,1]
輸出:0
解釋:在這種情況下, 沒有交易完成, 所以最大利潤為 0。

在數組中挑出兩個數,使其差值最大

1)暴力解法(兩層for循環) 超出時間限制時間復雜度O(n^2)

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;class Solution {public int maxProfit(int[] prices) {int ret = 0;if (prices == null || prices.length < 2) {return 0;}for (int i = 0; i < prices.length - 1; i++) {for (int j = i+1; j < prices.length; j++) {ret = Math.max(ret, prices[j] - prices[i]);}}return ret;}public static void main(String[] args) {Scanner sc=new Scanner(System.in);Solution solution=new Solution();List<Integer> pricesList = new ArrayList<>();while (sc.hasNextInt()) {pricesList.add(sc.nextInt());}int[] prices = new int[pricesList.size()];for (int i = 0; i < pricesList.size(); i++) {prices[i] = pricesList.get(i);}int ret=solution.maxProfit(prices);System.out.println(ret);sc.close();}
}//在輸入結束后輸入一個非數字字符(如字母 'q'),這樣 hasNextInt() 會返回 false,從而結束循環,或 Ctrl + Z(Windows)來發送 EOF 信號。

2)貪心

分為兩段,prevmin表示前一段中最小值(買入),prices[i]賣出去的價錢

class Solution {public int maxProfit(int[] prices) {int ret=0;for(int i=0,prevmin=Integer.MAX_VALUE;i<prices.length;i++){ret=Math.max(ret,prices[i]-prevmin);prevmin=Math.min(prevmin,prices[i]);}return ret;}
}

三、 (雙指針算法)

給定一個數組?nums,編寫一個函數將所有?0?移動到數組的末尾,同時保持非零元素的相對順序。

請注意?,必須在不復制數組的情況下原地對數組進行操作。

示例 1:

輸入: nums = [0,1,0,3,12]
輸出: [1,3,12,0,0]

數組劃分

利用數組下標充當指針?

兩個指針的作用:

cur:從左往右掃描,遍歷數組

dest:已處理的區間內,非0元素的最后一個位置

三個區間:

[0,dest]? ?[dest+1,cur-1]? [cur,n-1]

非0? ? ? ? ?0元素? ? ? ? ? ? ? ? ?待處理的區間

解法:

初始dest=-1 cur=0

遇到0元素,cur++;

遇到非0元素 swap(dest+1,cur)交換位置 dest++ cur++

class Solution {public void moveZeroes(int[] nums) {
int dest=-1;
int cur=0;
int k=0;
int n=nums.length;
while(cur<n){
if(nums[cur]==0)
cur++;
else
{dest++;
k=nums[dest];
nums[dest]=nums[cur];
nums[cur]=k;
cur++;
}}}
}

?

給你一個整數數組?prices?,其中?prices[i]?表示某支股票第?i?天的價格。

在每一天,你可以決定是否購買和/或出售股票。你在任何時候?最多?只能持有?一股?股票。你也可以先購買,然后在?同一天?出售。

返回?你能獲得的?最大?利潤?。

輸入:prices = [7,1,5,3,6,4]
輸出:7
解釋:在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5 - 1 = 4。
隨后,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6 - 3 = 3。
最大總利潤為 4 + 3 = 7 。

利用數組下標充當指針(i,j)

class Solution {public int maxProfit(int[] prices) {//雙指針算法int ret=0;int i=0,j=0;for(i=0;i<prices.length;i++){j=i;while(j+1<prices.length && prices[j+1]-prices[j]>0){j++;}ret+=prices[j]-prices[i];i=j;}return ret;}
}

四、遞歸

1.什么是遞歸

函數自己調用自己(主問題->相同的子問題)

出口(一個問題不能在分割了)? ? ? ? ? ?

1.算法思想

函數頭 函數體 遞歸出口

把遞歸的函數當成一個黑盒,不在意遞歸的細節

深度優先遍歷(后序遍歷)

2.例題

計算布爾二叉樹的值

給你一棵?完整二叉樹?的根,這棵樹有以下特征:

  • 葉子節點?要么值為?0?要么值為?1?,其中?0?表示?False?,1?表示?True?。
  • 非葉子節點?要么值為?2?要么值為?3?,其中?2?表示邏輯或?OR?,3?表示邏輯與?AND?。

計算?一個節點的值方式如下:

  • 如果節點是個葉子節點,那么節點的??為它本身,即?True?或者?False?。
  • 否則,計算?兩個孩子的節點值,然后將該節點的運算符對兩個孩子值進行?運算?。

返回根節點?root?的布爾運算值。

完整二叉樹?是每個節點有?0?個或者?2?個孩子的二叉樹。

葉子節點?是沒有孩子的節點。

class Solution {public boolean evaluateTree(TreeNode root) {if(root.left==null) return root.val==0 ? false: true;boolean left=evaluateTree(root.left);boolean right=evaluateTree(root.right);return root.val==2 ?left | right : left & right;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72387.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72387.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72387.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2月28日,三極管測量,水利-51單片機

眾所周知&#xff0c;三極管&#xff08;BJT&#xff09;有三個管腳&#xff0c;基極&#xff08;B&#xff09;、集電極&#xff08;C&#xff09;、發射極&#xff08;E&#xff09;&#xff0c;在實際應用中&#xff0c;不可避免地會遇到引腳辨別的問題。接下來就講下三極管…

Linux常見基本指令(二)

目錄 1、Linux基礎指令 文本查看 cat指令 more指令 less指令 head指令&tail指令 時間相關指令 查找、搜索相關指令 find指令 which指令 whereis指令 alias指令 grep指令 打包壓縮和解壓縮 zip指令&#xff08;壓縮&#xff09; unzip&#xff08;解壓&…

Day 55 卡瑪筆記

這是基于代碼隨想錄的每日打卡 所有可達路徑 題目描述 ? 給定一個有 n 個節點的有向無環圖&#xff0c;節點編號從 1 到 n。請編寫一個函數&#xff0c;找出并返回所有從節點 1 到節點 n 的路徑。每條路徑應以節點編號的列表形式表示。 輸入描述 ? 第一行包含兩個整數…

2. 在后端代碼中加入日志記錄模塊

1. 說明 日志模塊基本上是每一個軟件系統開發中必不可少的&#xff0c;主要用于持久記錄一些代碼運行中的輸出信息&#xff0c;輔助編碼人員進行代碼調試&#xff0c;以及后期軟件上線運行報錯分析。在Python中加入日志模塊比較簡單&#xff0c;只需要借助logging和RotatingFi…

【Vue3】淺談setup語法糖

Vue3 的 setup 語法糖是通過 <script setup> 標簽啟用的特性&#xff0c;它是對 Composition API 的進一步封裝&#xff0c;旨在簡化組件的聲明式寫法&#xff0c;同時保留 Composition API 的邏輯組織能力。以下是其核心概念和原理分析&#xff1a; 一、<script setu…

物聯網小范圍高精度GPS使用

在園區內實現小范圍高精度GPS&#xff08;全球定位系統&#xff09;定位&#xff0c;通常需要結合多種技術來彌補傳統GPS在精度和覆蓋范圍上的不足。以下是實現小范圍高精度GPS定位的解決方案&#xff0c;包括技術選擇、系統設計和應用場景。 一、技術選擇 在園區內實現高精度…

【前端】前端設計中的響應式設計詳解

文章目錄 前言一、響應式設計的定義與作用二、響應式設計的原則三、響應式設計的實現四、響應式設計的最佳實踐總結 前言 在當今數字化時代&#xff0c;網站和應用程序需要適應各種設備&#xff0c;從桌面電腦到平板電腦和手機。響應式設計應運而生&#xff0c;成為一種可以適…

Rocky Linux 系統安裝 typecho 個人博客系統(Docker 方式)

typecho 博客系統安裝 官網: https://typecho.org/ 1. 安裝 Docker curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo && yum install docker-ce -y && docker -v && systemctl enable --now docker…

pytorch-gpu版本安裝(英偉達gpu驅動安裝)

一、安裝cuda 1?? 檢查是否有 GPU lspci | grep -i nvidia如果沒有輸出&#xff0c;可能你的服務器 沒有 GPU&#xff0c;或者 GPU 未正確識別。 2?? 檢查 NVIDIA 驅動是否安裝 dpkg -l | grep -i nvidia如果沒有相關輸出&#xff0c;說明驅動未安裝&#xff0c;建議安…

華為OD-2024年E卷-分批薩[100分]

文章目錄 題目描述輸入描述輸出描述用例1解題思路Python3源碼 題目描述 吃貨"和"饞嘴"兩人到披薩店點了一份鐵盤&#xff08;圓形&#xff09;披薩&#xff0c;并囑咐店員將披薩按放射狀切成大小相同的偶數個小塊。但是粗心的服務員將披薩切成了每塊大小都完全不…

【計算機網絡入門】初學計算機網絡(六)

目錄 1.回憶數據鏈路層作用 2. 組幀 2.1 四種組幀方法 2.1.1 字符計數法 2.1.2 字節填充法 2.1.3 零比特填充法 2.1.4 違規編碼法 3. 差錯控制 3.1 檢錯編碼 3.1.1 奇偶校驗碼 3.1.2 CRC&#xff08;循環冗余校驗&#xff09;校驗碼 3.2 糾錯編碼 3.2.1 海明校驗碼…

yolo位姿估計實驗

目錄 介紹實驗過程 2.1 數據集下載 2.2 模型和數據配置文件修改 2.3 模型訓練參考鏈接 1. 介紹 1.1 簡介 YOLOv8-Pose是基于YOLOv4算法的姿勢估計模型&#xff0c;旨在實現實時高效的人體姿勢估計。姿勢估計在計算機視覺領域具有重要意義&#xff0c;可廣泛應用于視頻監控、…

極簡Redis速成學習

redis是什么&#xff1f; 是一種以鍵值對形式存儲的數據庫&#xff0c;特點是基于內存存儲&#xff0c;讀寫快&#xff0c;性能高&#xff0c;常用于緩存、消息隊列等應用情境 redis的五種數據類型是什么&#xff1f; 分別是String、Hash、List、Set和Zset&#xff08;操作命…

大語言模型學習--本地部署DeepSeek

本地部署一個DeepSeek大語言模型 研究學習一下。 本地快速部署大模型的一個工具 先根據操作系統版本下載Ollama客戶端 1.Ollama安裝 ollama是一個開源的大型語言模型&#xff08;LLM&#xff09;本地化部署與管理工具&#xff0c;旨在簡化在本地計算機上運行和管理大語言模型…

【OpenCV C++】以時間命名存圖,自動檢查存儲目錄,若不存在自動創建, 按下空格、回車、Q、S自動存圖

文章目錄 // 保存圖像的函數 void saveImage(const cv::Mat& frame) {// 生成唯一文件名auto now = std::chrono::system_clock::

【JavaEE】線程安全

【JavaEE】線程安全 一、引出線程安全二、引發線程安全的原因三、解決線程安全問題3.1 synchronized關鍵字&#xff08;解決修改操作不是原子的&#xff09;3.1.1 synchronized的特性3.1.1 synchronized的使用事例 3.2 volatile 關鍵字&#xff08;解決內存可見性&#xff09; …

Vue核心知識:動態路由實現完整方案

在Vue中實現動態路由&#xff0c;并結合后端接口和數據庫表設計&#xff0c;是一個復雜的項目&#xff0c;需要多個技術棧和步驟的配合。以下將詳細描述整個實現過程&#xff0c;包括數據庫設計、后端接口設計、前端路由配置以及如何實現動態路由的功能。 目錄 一、需求分析二…

自媒體多賬號如何切換不同定位才能做得更好

一、選擇稀缺增長的賽道&#xff0c;避開內卷紅海 1.職場賽道 ● 細分方向&#xff1a;公務員/體制內經驗分享、自由職業指南、遠程辦公技巧。例如&#xff0c;通過采訪自由職業者或分享遠程工作體驗&#xff0c;快速積累精準粉絲。 ● 優勢&#xff1a;職場人群需求明確&…

基于SpringBoot的校園二手交易平臺(源碼+論文+部署教程)

運行環境 校園二手交易平臺運行環境如下&#xff1a; ? 前端&#xff1a;Vue ? 后端&#xff1a;Java ? IDE工具&#xff1a;IntelliJ IDEA&#xff08;可自行更換&#xff09; ? 技術棧&#xff1a;SpringBoot Vue MySQL 主要功能 校園二手交易平臺主要包含前臺和…

iPhone 鏡像 連接錯誤

重置連接 defaults delete com.apple.ScreenContinuity打開 iPhone 鏡像 參考 mac鏡像iPhone無法連接報錯個人經歷的 iPhone 鏡像 bug 與部分解決辦法