LeetCode 196, 73, 105

目錄

  • 196. 刪除重復的電子郵箱
    • 題目鏈接
    • 要求
    • 知識點
    • 思路
    • 代碼
  • 73. 矩陣置零
    • 題目鏈接
    • 標簽
    • 簡單版
      • 思路
      • 代碼
    • 優化版
      • 思路
      • 代碼
  • 105. 從前序與中序遍歷序列構造二叉樹
    • 題目鏈接
    • 標簽
    • 思路
    • 代碼

196. 刪除重復的電子郵箱

題目鏈接

196. 刪除重復的電子郵箱

  • Person的字段為idemail

要求

編寫解決方案 刪除 所有重復的電子郵件,只保留一個具有最小 id 的唯一電子郵件。

(對于 SQL 用戶,請注意你應該編寫一個 DELETE 語句而不是 SELECT 語句。)

(對于 Pandas 用戶,請注意你應該直接修改 Person 表。)

運行腳本后,顯示的答案是 Person 表。驅動程序將首先編譯并運行您的代碼片段,然后再顯示 Person 表。Person 表的最終順序 無關緊要

知識點

  1. delete:刪除數據。形式上類似于select

思路

保留一個具有最小 id 的唯一電子郵件意味著刪除所有 比最小 id 的電子郵件的 id 大 且 與其 email 相同 的電子郵件,所以可以使用多表“查詢”,首先得限制兩個表的 email 相同,然后刪除 id 大的那些數據即可。

代碼

deletep_big
fromPerson p_big,Person p_small
wherep_big.email = p_small.email
andp_big.id > p_small.id

73. 矩陣置零

題目鏈接

73. 矩陣置零

標簽

數組 哈希表 矩陣

簡單版

思路

如果一個元素為 0 ,則將其所在行和列的所有元素都設為 0 。這意味著只需要用兩個數組,分別存儲這行和這列是否有0,如果這行有0,則將這行元素置零;如果這列有0,則將這列元素置零。

代碼

class Solution {public void setZeroes(int[][] matrix) {int m = matrix.length, n = matrix[0].length;boolean[] isRow0 = new boolean[m];boolean[] isCol0 = new boolean[n];// 檢查每一行和每一列是否有為0的數字for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (matrix[i][j] == 0) {isRow0[i] = true;isCol0[j] = true;}}}// 置零for (int i = 0; i < m; i++) {if (isRow0[i]) {for (int j = 0; j < n; j++) {matrix[i][j] = 0;}}}for (int j = 0; j < n; j++) {if (isCol0[j]) {for (int i = 0; i < m; i++) {matrix[i][j] = 0;}}}}
}

優化版

思路

可以將統計每行每列是否有0的數組放到原矩陣中,這里使用每行的第一個元素(列首)和每列的第一個元素(行首)來統計當前行是否有0和當前列是否有0,如果有0,則列首或行首置為0。然后對“整個”(從第二行到最后一行,從第二列到最后一列的)矩陣進行掃描,如果這行第一個元素或這列第一個元素是0,則將該元素置零。

那么問題就來了,既然在此處修改了第一行和第一列,那么該如何判斷原始的第一行和第一列是否需要置零呢?使用兩個變量提前對第一行和第一列進行判斷即可。在 對“整個”(從第二行到最后一行,從第二列到最后一列的)矩陣進行掃描 完畢后,對第一行和第一列進行操作,如果原先第一行有0,則將第一行置零;如果原先第一列有0,則將第一列置零。

注意:這樣做不會破壞原矩陣(或者說不影響結果),因為如果某行(或某列)有0,那么這行(或這列)的所有元素都需要被置零。

代碼

class Solution {public void setZeroes(int[][] matrix) {int m = matrix.length, n = matrix[0].length;boolean isFirstRow0 = false, isFirstCol0 = false;// 檢查第一列是否有為0的數字for (int i = 0; i < m; i++) {if (matrix[i][0] == 0) {isFirstCol0 = true;break;}}// 檢查第一行是否有為0的數字for (int i = 0; i < n; i++) {if (matrix[0][i] == 0) {isFirstRow0 = true;break;}}// 檢查 第二行到最后一行 第二列到最后一列 是否有為0的數字for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (matrix[i][j] == 0) { // 如果有重復數字matrix[i][0] = matrix[0][j] = 0; // 則將本矩陣的 行首 和 列首 記為0}}}// 將 第二行到最后一行 第二列到最后一列 的元素置零for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (matrix[i][0] == 0 || matrix[0][j] == 0) { // 如果 本行首 或 本列首 被置零matrix[i][j] = 0; // 則將該元素置為0}}}// 如果原先矩陣的第一行有0,則將第一行置零if (isFirstRow0) {for (int j = 0; j < n; j++) {matrix[0][j] = 0;}}// 如果原先矩陣的第一列有0,則將第一行置零if (isFirstCol0) {for (int i = 0; i < m; i++) {matrix[i][0] = 0;}}}
}

105. 從前序與中序遍歷序列構造二叉樹

題目鏈接

105. 從前序與中序遍歷序列構造二叉樹

標簽

樹 數組 哈希表 分治 二叉樹

思路

注意:如果遍歷的結果中有相同的元素,則無法構造二叉樹,所以本題中的遍歷結果都是無重復值的。

先來思考一下只有中序遍歷應該如何構造二叉樹?眾所周知,中序遍歷是先遍歷左子樹、再處理本節點、最后遍歷右子樹,所以說在中序遍歷的結果中,中間元素是父節點(前提是它左子樹的節點數等于右子樹的節點數),中間元素的左子區間為它的左子樹,中間元素的右子區間為它的右子樹。

根據中間節點把整個遍歷結果拆分為兩個子區間,這兩個子區間也有這樣的性質:子區間的中間元素是父節點(前提是它左子樹的節點數等于右子樹的節點數),中間元素的左子區間為它的左子樹,右子區間為它的右子樹。

例如底下的二叉樹,它的中序遍歷結果為[1, 2, 3, 4, 5, 6, 7],第一個父節點(根節點)為4,然后分出[1, 2, 3][5, 6, 7]這兩個子區間。在[1, 2, 3]中找到父節點2,在[5, 6, 7]中找到父節點6,接著將區間分為長度為1的子區間。此時直接將這個值作為葉子節點(沒有子節點的節點)即可。

二叉樹

既然只需要知道中序遍歷就能夠構造二叉樹,那為什么還要前序遍歷的結果?這是因為存在一種二叉樹,這種二叉樹有些節點只有一個子節點,就不能確定哪個節點是父節點。

比如底下的二叉樹,它的中序遍歷結果為[2, 3, 4, 5, 6, 7],此時就不能輕易地將4作為第一個父節點了,因為4的左右子樹的節點數不相等。所以只知道中序遍歷的結果是無法構造二叉樹的,因為無法確定父節點

在這里插入圖片描述

在前序遍歷的結果[4, 2, 3, 6, 5, 7]中,第一個元素4就是第一個父節點,然后在中序遍歷的結果[2, 3, 4, 5, 6, 7]中尋找父節點,并劃分左子樹[2, 3]和右子樹[5, 6, 7]

發現左子樹含有的元素[2, 3] 和 前序遍歷結果[4, 2, 3, 6, 5, 7]去掉父節點4后截取前2個元素(2是左子樹的長度)的結果[2, 3]含有的元素 恰好相同,右子樹含有的元素[5, 6, 7] 和 前序遍歷結果[4, 2, 3, 6, 5, 7]去掉父節點4后截取后3個元素(3是右子樹的長度)的結果[6, 5, 7]含有的元素 恰好相同。

所以構造二叉樹的策略就確定了:將前序遍歷區間內第一個值作為二叉樹的父節點,在中序遍歷的結果中尋找這個值,然后將這個值左邊的區間定義為左子樹,右邊的區間定義為右子樹,接著將前序遍歷的結果也進行劃分,去除第一個元素后,將前n(n是中序遍歷劃分的左子樹的長度)個元素作為左子樹,將后m(m是中序遍歷劃分的右子樹的長度)個元素作為右子樹。劃分完這兩個數組后,分別構造左子樹和右子樹。

代碼

class Solution {public TreeNode buildTree(int[] preorder, int[] inorder) {if (preorder.length == 0) { // 如果preorder的長度為0return null; // 則退出遞歸}int parentValue = preorder[0]; // 記錄父節點的值TreeNode parent = new TreeNode(parentValue); // 以preorder的第一個值作為父節點for (int i = 0; i < preorder.length; i++) {if (inorder[i] == parentValue) { // 如果在inorder中找到父節點int[] preLeft = Arrays.copyOfRange(preorder, 1, i + 1); // 截取preorder的左子樹區間int[] preRight = Arrays.copyOfRange(preorder, i + 1, inorder.length); // 截取preorder的右子樹區間int[] inLeft = Arrays.copyOfRange(inorder, 0, i); // 截取inorder的左子樹區間int[] inRight = Arrays.copyOfRange(inorder, i + 1, inorder.length); // 截取inorder的右子樹區間parent.left = buildTree(preLeft, inLeft); // 構造左子樹parent.right = buildTree(preRight, inRight); // 構造右子樹break;}}return parent; // 返回本輪遞歸的父節點}
}

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

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

相關文章

昇思MindSpore學習總結七——模型訓練

1、模型訓練 模型訓練一般分為四個步驟&#xff1a; 構建數據集。定義神經網絡模型。定義超參、損失函數及優化器。輸入數據集進行訓練與評估。 現在我們有了數據集和模型后&#xff0c;可以進行模型的訓練與評估。 2、構建數據集 首先從數據集 Dataset加載代碼&#xff0…

檢測站機動車授權簽字人試題附答案

16、___的輪胎胎冠上花紋深度不得小于3.2mm。( ) A、乘用車 B、摩托車 C、貨車的轉向輪&#xff08;正確答案&#xff09; D、掛車 17、最大設計時速≥100km/h的機動車其轉向盤自由轉動量不大于__。( ) A、30 度 B、20 度&#xff08;正確答案&#xff09; C、45 度 D、40度…

在windows上安裝objection

安裝命令pip install objection -i https://mirrors.aliyun.com/pypi/simple hook指定進程 objection -g 測試 explore 進程名不定是包名&#xff0c;也可能是app名字&#xff0c;如“測試”就是app的名字 若出現如下錯誤&#xff0c;說明python 缺少setuptools 直接安裝setu…

擲骰子游戲 、 求絕對值,平方根,對數,正弦值 題目

題目 JAVA33 擲骰子游戲分析&#xff1a;代碼&#xff1a; JAVA34 求絕對值&#xff0c;平方根&#xff0c;對數&#xff0c;正弦值分析&#xff1a;代碼&#xff1a; JAVA33 擲骰子游戲 描述開發一個擲骰子游戲&#xff0c;即每次運行程序時&#xff0c;產生一個[1,6]之間的隨…

秋招突擊——設計模式補充——單例模式、依賴倒轉原則、工廠方法模式

文章目錄 引言正文依賴倒轉原則工廠方法模式工廠模式的實現簡單工廠和工廠方法的對比 抽線工廠模式最基本的數據訪問程序使用工廠模式實現數據庫的訪問使用抽象工廠模式的數據訪問程序抽象工廠模式的優點和缺點使用反射抽象工廠的數據訪問程序使用反射配置文件實現數據訪問程序…

檢索增強生成RAG系列6--RAG提升之查詢結構化(Query Construction)

系列5中講到會講解3個方面RAG的提升&#xff0c;它們可能與RAG的準確率有關系&#xff0c;但是更多的它們是有其它用途。本期來講解第二部分&#xff1a;查詢結構化&#xff08;Query Construction&#xff09;。在系列3文檔處理中&#xff0c;我們著重講解了文檔解析&#xff…

C++ dll導出類的方法

要在C動態庫中導出類&#xff0c;可以使用以下步驟&#xff1a; 定義一個類并實現其成員函數。在類的聲明前加上__declspec(dllexport)標記&#xff08;Windows平臺&#xff09;或__attribute__((visibility("default")))標記&#xff08;Linux平臺&#xff09;&…

C語言學習筆記--第一個程序

第一個C語言程序 #include<stdio.h> //引用輸入輸出頭文件&#xff0c;每一次都需要引用這個文件 //.h是頭文件 // .c是源文件 // .cpp是C源文件&#xff0c;兼容C //C的第一個程序 // 行注釋&#xff08;只能注釋這一行&#xff09; /*塊注釋 */ int main() {printf(&…

能保存到相冊的風景視頻在哪下載?下載風景視頻網站分享

在當今以視覺為核心的時代&#xff0c;高清美麗的風景視頻不僅能夠豐富我們的日常生活&#xff0c;還能提供心靈上的慰藉。無論是為了制作視頻項目&#xff0c;還是僅僅想要珍藏一些精美的風景畫面&#xff0c;獲取高質量的風景視頻素材顯得尤為重要。許多人可能會問&#xff1…

PTrade量化軟件常見問題整理系列2

一、研究界面使用get_fundamentals函數報錯&#xff1a;error_info:獲取token失敗&#xff1f; 研究界面使用get_fundamentals函數報錯&#xff1a;error_info:獲取token失敗&#xff1f; 1、測試版本202202.01.052&#xff0c;升級202202.01.051版本后&#xff0c;為了解決不…

在虛擬仿真中學習人工智能,可以達到什么目標?

人工智能已經成為引領社會創新的關鍵力量&#xff0c;想要在這個充滿機遇的領域中脫穎而出&#xff0c;掌握扎實的專業技能和積累豐富的實踐經驗至關重要。然而&#xff0c;許多學習者在追求這一目標的過程中面臨著幾個主要問題&#xff1a;專業技術掌握有難度、實踐經驗積累存…

linux中awk,sed, grep使用

《linux私房菜》這本書中將sed和awk一同歸為行的修改這一點&#xff0c;雖然對&#xff0c;但不利于實際處理問題時的思考。因為這樣的話&#xff0c;當我們實際處理問題時&#xff0c;遇到比如說統計文本打印內容時&#xff0c;我們選擇sed還是awk進行處理呢&#xff1f; 也因…

?香橙派AIpro測評:usb魚眼攝像頭的Camera圖像獲取

一、前言 近期收到了一塊受到業界人士關注的開發板"香橙派AIpro",因為這塊板子具有極高的性價比&#xff0c;同時還可以兼容ubuntu、安卓等多種操作系統&#xff0c;今天博主便要在一塊832g的香橙派AI香橙派AIpro進行YoloV5s算法的部署并使用一個外接的魚眼USB攝像頭…

React 中如何使用 Monaco

Monaco 是微軟開源的一個編輯器&#xff0c;VSCode 也是基于 Monaco 進行開發的。如果在 React 中如何使用 Monaco&#xff0c;本文將介紹如何在 React 中引入 Monaco。 安裝 React 依賴 yarn add react-app-rewired --dev yarn add monaco-editor-webpack-plugin --dev yarn…

學習和發展人工智能:新興趨勢和成功秘訣

人工智能(AI)繼續吸引組織&#xff0c;因為它似乎無窮無盡地提高生產力和業務成果。在本博客中&#xff0c;了解學習和發展(L&D)部門如何利用人工智能改進流程&#xff0c;簡化工作流程&#xff1f; 學習與發展(L&D)部門領導開始探索如何提高和支持人工智能能力的勞動…

1-認識網絡爬蟲

1.什么是網絡爬蟲 ? 網絡爬蟲&#xff08;Web Crawler&#xff09;又稱網絡蜘蛛、網絡機器人&#xff0c;它是一種按照一定規則&#xff0c;自動瀏覽萬維網的程序或腳本。通俗地講&#xff0c;網絡爬蟲就是一個模擬真人瀏覽萬維網行為的程序&#xff0c;這個程序可以代替真人…

工業智能網關在現代工業生產中的重要性-天拓四方

工業智能網關是一款具備挖掘工業設備數據并接入到自主開發的云平臺的智能嵌入式網絡設備。它具備數據采集、協議解析、邊緣計算&#xff0c;以及4G/5G/WiFi數據傳輸等功能&#xff0c;并能接入工業云平臺。這種網關不僅支持采集PLC、傳感器、儀器儀表和各種控制器&#xff0c;還…

iss文件本機可以訪問,其他電腦無法訪問解決

1.搜索的時候有很多答案&#xff0c;總結就是2種 引用來自這位大佬的博客跳轉 2.我實際解決了的方法 將這里的ip地址修改為你局域網wifi的ip 如何看自己wifi的ip&#xff0c;大家自行百度&#xff01;

linux中與網絡有關的命令

本文的命令總覽 ifconfig命令 在 Linux 系統中&#xff0c;ifconfig 命令用于配置和顯示網絡接口的信息&#xff0c;包括 IP 地址、MAC 地址、網絡狀態等。同時我們也可以利用ifconfig 命令設置網絡接口對應的ip地址&#xff0c;子網掩碼等 當你使用 ifconfig 命令時&#xf…

06-6.3.3 圖的深度優先遍歷

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜歡《數據結構》部分筆記的小伙伴可以…