J20250704 算法題5道

題目一覽:

606. 根據二叉樹創建字符串 - 力扣(LeetCode)

506. 相對名次 - 力扣(LeetCode)

1. 兩數之和 - 力扣(LeetCode)

100. 相同的樹 - 力扣(LeetCode)

101. 對稱二叉樹 - 力扣(LeetCode)

這是周一截止到今天周五的,這次選的題目都比較簡單。大部分都和二叉樹用dfs解題有關(因為前一整子學了這些,剛好就再寫一遍),有一道是關于最近學的堆排序。

題解:

1. 根據二叉樹創建字符串

給你二叉樹的根節點?root?,請你采用前序遍歷的方式,將二叉樹轉化為一個由括號和整數組成的字符串,返回構造出的字符串。

空節點使用一對空括號對?"()"?表示,轉化后需要省略所有不影響字符串與原始二叉樹之間的一對一映射關系的空括號對。

解:這道題的關鍵是明白什么時候存放root.val,什么時候存放? “()”“( ”? “? )”

1)創建StringBuilde類型的對象stringbuilder,之后得到結果都可以通過append操作一步步添加到stringbuilder中。

2)遍歷二叉樹(遞歸):?

a. 需要分別判斷左子樹和右子樹的情況,當 root 不為空,則將 root.val 放到stringbuilder中。

b. 再去看左子樹情況 ——> 判斷 root.left 是否為空,不為空就將“( ” 放到stringbuilder中,代表有左子樹,再將左子樹的根放入函數進行遞歸,重復上面的操作。而如果 root.left 為空,就需要判斷右子樹,右子樹也為空,則直接返回,不為空則將“()” 放入stringbuilder再返回。

c. 判斷右子樹的情況的代碼邏輯則和左子樹一致。唯一不同的是如果判斷右子樹為空的話,不用再去判斷左子樹是否為空,而是直接返回

d. 最后得到結果stringbuilder,輸出即可

注意:在每次遞歸返回時,“ )”都會放入stringbuilder。不需要在其他地方再加多余的 “)”。(不太明白的話可以看看代碼理解)

代碼:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public String tree2str(TreeNode root) { StringBuilder stringBuilder = new StringBuilder();tree2strChild(root,stringBuilder);return stringBuilder.toString();}public void tree2strChild(TreeNode root,StringBuilder stringBuilder){if(root == null){return;}stringBuilder.append(root.val);//判斷左子樹的情況if(root.left!=null){stringBuilder.append("(");tree2strChild(root.left,stringBuilder);stringBuilder.append(")");}else{if(root.right!=null){stringBuilder.append("()");}else{return;}}//判斷右子樹的情況if(root.right!=null){stringBuilder.append("(");tree2strChild(root.right,stringBuilder);stringBuilder.append(")");} else{return;}}
}

2. 相對名次

給你一個長度為?n?的整數數組?score?,其中?score[i]?是第?i?位運動員在比賽中的得分。所有得分都?互不相同?。

運動員將根據得分?決定名次?,其中名次第?1?的運動員得分最高,名次第?2?的運動員得分第?2?高,依此類推。運動員的名次決定了他們的獲獎情況:

  • 名次第?1?的運動員獲金牌?"Gold Medal"?。
  • 名次第?2?的運動員獲銀牌?"Silver Medal"?。
  • 名次第?3?的運動員獲銅牌?"Bronze Medal"?。
  • 從名次第?4?到第?n?的運動員,只能獲得他們的名次編號(即,名次第?x?的運動員獲得編號?"x")。

使用長度為?n?的數組?answer?返回獲獎,其中?answer[i]?是第?i?位運動員的獲獎情況。

解:這道題的思路很簡單,首先要得到名次,就需要排序。然后對照原數組,按照對應的位置給出排名情況。一開始寫的是得到一個排完序的數組,然后兩個for循環嵌套,一個個對照,結果放進answer數組,但是這樣做會超出時間限制,時間復雜度為O(n^2),所以后面又用到了哈希表,這樣就可以快速得到對應鍵值的在原數組的下標

1)這里為了鞏固學習的新知識,排序采用了堆排序

a. 首先將原數組復制一份,再將復制的數組變成小根堆

b. 每次將堆頂元素和最后一個元素交換,再將堆數組的長度減1,把其余的部分再進行siftdown,變成小根堆后,重復交換操作和長度減1,以及siftdown操作,以此完成堆排序。

2)哈希表存好原數組以及對應的原始下標,將排完序的數組的值循環給哈希表,得到原始位置,將名次按照原始位置放入answer數組中即可。

代碼:

//1.用堆排序,將數組排成降序
//2.將在ret數組中找到score數組中數據所在的下標名次就是i+1
//3.創建answer數組,將對比出來的結果依次放入answers數組class Solution {int[] ret;public void siftDown(int parent,int usedSize){int child = 2 * parent + 1;while(child < usedSize){//child是否需要換位置if(child + 1 < usedSize && ret[child] > ret[child+1]){child++;}if(ret[child] < ret[parent]){int temp;temp = ret[child];ret[child] = ret[parent];ret[parent] = temp;parent = child;child = 2 * parent + 1;}else{break;}}}public void heapSort(int end){while(end > 0){int temp;temp = ret[end];ret[end] = ret[0];ret[0] = temp;siftDown(0,end);end--;}}public String[] findRelativeRanks(int[] score) {//為防止超時(一開始使用兩個for循環嵌套得answer數組超時了...),使用哈希表Map<Integer,Integer> scoreIndexMap = new HashMap<>();for(int i = 0;i < score.length;i++){scoreIndexMap.put(score[i],i);}String[] answer = new String[score.length]; ret = Arrays.copyOf(score,score.length);int child = ret.length-1;int parent = (child-1)/2;for(int i = parent ; i >= 0 ; i--){siftDown(i,ret.length);}//創建好小根堆后,使用堆排序(降序)heapSort(score.length-1);for(int i = 0;i < ret.length;i++){//找到對應位置int originalIndex = scoreIndexMap.get(ret[i]);if(i == 0){answer[originalIndex] = "Gold Medal";}else if(i == 1){answer[originalIndex] = "Silver Medal";}else if(i == 2){answer[originalIndex] = "Bronze Medal";}else{answer[originalIndex] = String.valueOf(i+1);}}return answer;}
}

3.兩數之和

給定一個整數數組?nums?和一個整數目標值?target,請你在該數組中找出?和為目標值?target? 的那?兩個?整數,并返回它們的數組下標。

你可以假設每種輸入只會對應一個答案,并且你不能使用兩次相同的元素。

你可以按任意順序返回答案。

解:這里一開始用的是暴力解法,兩個循環嵌套遍歷即可。降低時間復雜度可以使用哈希表,提供利用哈希表的解法。

1)遍歷nums數組,將target - nums[ i ] 給哈希表,查看哈希表是否存在對應的數,如果咩有就將num[ i ] 和 i 放進哈希表,然后繼續判斷。

這里的巧妙就在于哈希表并沒有一開始就放入數據,而是在遍歷過程一步步將數據放入哈希表。

代碼:

class Solution {public int[] twoSum(int[] nums, int target) {//為了降低時間復雜度,采用哈希表Map<Integer,Integer> hashtable =new HashMap<>();for(int i = 0;i<nums.length;i++){//在哈希表中查找是否存在target-nums[i],如果有就把位置返回if(hashtable.containsKey(target - nums[i])){return new int[]{hashtable.get(target-nums[i]),i};}hashtable.put(nums[i],i);}return new int[0];}
}

4.相同的樹

給你兩棵二叉樹的根節點?p?和?q?,編寫一個函數來檢驗這兩棵樹是否相同。

如果兩個樹在結構上相同,并且節點具有相同的值,則認為它們是相同的。

解:弄清true和false的情況,同時遍歷兩棵樹即可。

1)true:

a. 兩顆樹都為null

b. 節點的值相同(如果節點的值相同,則可以進行下一步,而不是返回true,最終返回true還是要看節點是否同時到了null

2)false:

a. 一顆樹為空,另一棵樹不為空

b. 節點的值不相同

3)最后返回 左子樹的比較情況&&右子樹的比較情況

代碼:

class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {if (p == null && q == null) {return true;} else if (p == null || q == null) {return false;} else if (p.val != q.val) {return false;} else {return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);}}
}

5.對稱二叉樹

給你一個二叉樹的根節點?root?, 檢查它是否軸對稱。

解:關鍵在于找到判斷軸對稱的方法,代碼應該怎么寫。(和第4題差不多思想,直接看代碼也可)

1)先判斷root.left 和root.right 是否相等,相等則繼續向下探查,直到出現null 或者二者數值不同時返回true或者false(如果root為null,則直接返回true)

2)再通過遞歸,root.left作為L,root.right作為R,判斷L.left 和 R.right是否相等,以及L.right 和 R.left 是否相等

3)true和false的情況和第4題差不多,可以看代碼理解,最后返回 judge(L.left,R.right) && judge(L.right,R.left)

代碼:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean judge(TreeNode L,TreeNode R){if(L == null && R == null){return true;}else if(L != null && R == null || L == null && R != null){return false;}else if(L.val != R.val){return false;}//判斷對稱return judge(L.left,R.right) && judge(L.right,R.left);}public boolean isSymmetric(TreeNode root) {if(root == null){return true;}return judge(root.left,root.right);}
}

OK,就先這樣

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

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

相關文章

UNet改進(15):分組注意力機制在UNet中的應用探索

引言 注意力機制已成為現代深度學習架構中不可或缺的組成部分,特別是在計算機視覺領域。近年來,各種注意力機制的變體被提出,以解決不同場景下的特定問題。本文將深入探討一種稱為分組注意力(Grouped Attention)的機制,以及它如何被集成到經典的UNet架構中,從而提升模型在…

C++之路:類基礎、構造析構、拷貝構造函數

目錄 前言從結構體到類類的聲明與使用基礎聲明繼承聲明數據與函數聲明與調用聲明調用 類的訪問修飾符類對象的內存分布類內數據相關靜態變量非靜態變量 類成員函數相關普通成員函數友元函數構造與析構函數構造函數析構函數 拷貝構造函數總結 前言 面向對象編程有三大特性&#…

黑神話悟空游戲輿情分析

完整項目包點擊文末名片 黑神話悟空上線初期輿情分析 背景 《黑神話&#xff1a;悟空》在上線首日便創下了全球游戲行業的多項新紀錄&#xff0c;包括Steam同時在線人數超過222萬&#xff0c;全渠道總銷量超過450萬份&#xff0c;總銷售額超過15億元。本項目旨在對 3A 游戲《黑…

python的or-tools算法踩坑

debug模式代碼好的,然后正常運行不行(用的PyCharm) 不知道為什么debug模式這個可以的,但是正常模式不行 用or-tools算路徑的時候 因為要多次到達同一個點,但是or-tools不支持,所以弄了虛擬點和真實點的距離是0,但是實際上如果虛擬點到真實點為0的話or-tools結果秒出,但是實…

docker-compose一鍵部署全棧項目。springboot后端,react前端

部署總覽前端打包: 我們將配置 package.json&#xff0c;使用 npm run build (內部調用 vite build) 來打包。這個過程將完全在 Docker 構建鏡像的過程中自動完成&#xff0c;你的主機上甚至不需要安裝 Node.js。后端打包: 我們將配置 pom.xml&#xff0c;使用 mvn clean packa…

MCMC:高維概率采樣的“隨機游走”藝術

MCMC&#xff08;馬爾可夫鏈蒙特卡洛&#xff09; 是一種從復雜概率分布中高效采樣的核心算法&#xff0c;它解決了傳統采樣方法在高維空間中的“維度災難”問題。以下是其技術本質、關鍵算法及實踐的深度解析&#xff1a; 本文由「大千AI助手」原創發布&#xff0c;專注用真話…

HarmonyOS免密認證方案 助力應用登錄安全升級

6月21日&#xff0c;2025年華為開發者大會"安全與隱私分論壇"在松山湖順利舉辦。本論壇聚焦App治理與監管、星盾安全2.0的核心能力等進行深度分享與探討。其中&#xff0c;HarmonyOS Passkey免密認證方案作為安全技術創新成果備受矚目。該方案基于FIDO協議實現&#…

flutter flutter_vlc_player播放視頻設置循環播放失效、初始化后獲取不到視頻寬高

插件&#xff1a;flutter_vlc_player: ^7.4.3 問題1&#xff1a;設置循環播放_controller.setLooping(true);無用。 解決方法&#xff1a; //vlcPlayer設置循環播放失效&#xff0c;以這種方式失效循環播放 _setLoopListener() async {if (_videoController!.value.hasError…

React與Vue的主要區別

React和Vue都是當今最流行、最強大的前端Javascript框架&#xff0c;它們都能構建出色的單頁面應用。 以下是React和Vue的主要區別&#xff1a; React&#xff1a; React官方自稱是一個用于構建用戶界面的JavaScript庫&#xff08;尤其是UI組件&#xff09;。它專注于視圖層。…

瀏覽器原生控件上傳PDF導致hash值不同

用戶要求對上傳的pdf計算hash排重&#xff0c;上線后發現排重失敗 1、postman直接調用接口沒有發現問題&#xff0c;每次獲取的hash值是一樣的 2、apifox網頁版&#xff0c;調用接口發現問題&#xff0c;清除緩存后&#xff08;將選擇的文件刪除重新選擇&#xff09;&#xf…

.net 的依賴注入

依賴注入(Dependency Injection,簡稱 DI)是一種軟件設計模式,旨在將對象之間的依賴關系從代碼內部解耦出來,通過外部提供的方式來建立依賴關系,從而提高軟件的可維護性、可測試性和可擴展性。以下從概念、工作原理、常見類型、在不同框架中的應用等方面進行詳細解釋: 概…

【unitrix】 4.17 類型級別右移運算實現解析(shr.rs)

一、源碼 這段代碼實現了類型級別的右移運算&#xff08;>>&#xff09;&#xff0c;包括對整數和定點數的支持。 /*類型級別的右移運算實現* 編制人: $ource* 修改版次:0版完成版* 本版次創建時間: 2025年6月27日* 最后修改時間: 2025年7月2日 Sub1修改* 待完善問題&a…

Java 并發核心:AQS(AbstractQueuedSynchronizer) 詳解

一、什么是 AQS&#xff1f; AbstractQueuedSynchronizer&#xff08;簡稱 AQS&#xff09;是 Java 并發包 java.util.concurrent.locks 中的一個核心同步框架&#xff0c;用于構建鎖和同步器&#xff0c;如&#xff1a; ReentrantLockReentrantReadWriteLockCountDownLatchS…

LoRA 實戰指南:NLP 與 CV 場景的高效微調方法全解析

大模型已成 AI 應用的“標配”&#xff0c;但高昂的訓練和部署成本讓很多企業望而卻步。LoRA&#xff08;Low-Rank Adaptation&#xff09;作為一種輕量級微調方案&#xff0c;正成為 NLP 與 CV 場景中低成本定制的利器。本文詳細通過詳細介紹 LoRA 的核心原理、在文本與圖像任…

centos指令

一、python 1、查詢運行中腳本 ps aux | grep python2、關閉腳本進程 kill -15 <PID> # 優雅終止&#xff08;SIGTERM&#xff09; kill -9 <PID> # 強制終止&#xff08;SIGKILL&#xff09;

用c語言寫一個找兩張圖片不同處的游戲

回答 思考完成 我們計劃開發一個用C語言實現的查找兩張圖片不同之處的游戲。這個程序需要加載兩張圖片&#xff0c;然后允許用戶通過點擊等方式標記出差異的位置。我們將使用一個簡單的圖形庫&#xff08;例如SDL&#xff09;來處理圖像和用戶交互。步驟&#xff1a;1.加載兩…

【深度學習:進階篇】--4.3.seq2seq與Attention機制

學習目標 目標 掌握seq2seq模型特點掌握集束搜索方式掌握BLEU評估方法掌握Attention機制 應用 應用Keras實現seq2seq對日期格式的翻譯 目錄 學習目標 1.seq2seq 1.1.定義 1.2.條件語言模型理解 1.3.應用場景 2.注意力機制 2.1.長句子問題 2.2.定義 2.3.公式 3.機器…

MYSQL與PostgreSQL的差異

一、架構設計的根本差異 進程模型 vs 線程模型 ?PostgreSQL?&#xff1a;采用多進程架構&#xff08;每個連接獨立進程&#xff09;&#xff0c;通過共享內存通信。優勢在于進程隔離性強&#xff0c;單連接崩潰不影響整體服務&#xff0c;但資源消耗較高。 ?MySQL?&…

Wpf布局之StackPanel!

文章目錄 前言一、引言二、使用步驟 前言 Wpf布局之StackPanel&#xff01; 一、引言 StackPanel面板在水平或垂直的堆棧中放置元素。這個布局容器通常用于更大、更復雜窗口中的一些區域。 二、使用步驟 StackPanel默認是垂直堆疊 <Grid><StackPanel><Butt…

【MySQL】 內置函數

目錄 1.時間函數2.字符串函數3.數學函數4.其他函數 1.時間函數 函數名稱描述current_date()當前日期current_time()當前時間current_timestamp()當前時間戳date(datetime)返回datetime參數的日期部分date_add(date,interval d_value_type)在date中添加日期/時間&#xff0c;in…