LeetCode 1351, 1, 208

目錄

  • 1351. 統計有序矩陣中的負數
    • 題目鏈接
    • 標簽
    • 簡答二分查找
      • 思路
      • 代碼
    • 優化
      • 思路
      • 代碼
  • 1. 兩數之和
    • 題目鏈接
    • 標簽
    • 思路
    • 代碼
  • 208. 實現 Trie (前綴樹)
    • 題目鏈接
    • 標簽
    • 思路
    • 代碼

1351. 統計有序矩陣中的負數

題目鏈接

1351. 統計有序矩陣中的負數

標簽

數組 二分查找 矩陣

簡答二分查找

思路

由于矩陣每行都是按 降序 排列的,所以可以針對每行都使用二分查找來查找最后一個不是負數的元素的索引,然后給 總數 加上 本行元素個數 減去 這個索引 再 減一,不過要注意的一點是,最后一個不是負數的元素可能是重復的,所以不能在找到最后一個不是負數的元素后就退出查找,而應該繼續到 右子區間 查找,直到找到 最右邊的 不是最后一個負數的元素。

代碼

class Solution {public int countNegatives(int[][] grid) {int m = grid[0].length; // m是矩陣的列數int left, right;int cnt = 0; // 統計負數的個數for (int[] row : grid) { // 針對矩陣的每行進行操作// 每次都把查找區間限制在 [0, m - 1] 之間left = 0;right = m - 1;while (left <= right) {int mid = left + (right - left >> 1);if (0 > row[mid]) { // 如果 row[mid] < 0right = mid - 1; // 則到左子區間查詢(降序數組)} else if (0 < row[mid]) { // 如果 row[mid] > 0left = mid + 1; // 則到右子區間查詢(降序數組)} else { // 如果 row[mid] == 0left = mid + 1; // 則到右子區間查詢(降序數組)}}cnt += m - right - 1; // 統計本行的負數個數}return cnt;}
}

優化

思路

像上面的多個二分查找之間沒有任何聯系,每次都是在 [ 0 , m ? 1 ] [0, m - 1] [0,m?1] 這個大區間進行查詢,這樣就浪費了這個矩陣的另一個特性:每列也是按降序排列的

那么該如何利用這個特性呢?很簡單,有這個特性再加上每行都是降序排列的,就意味著 在上一行中最后一個0出現的位置 一定比 本行中最后一個0出現的位置 要更靠右或相同,所以二分查找本行時不需要將右端點重置為 m - 1,繼承上一次的右端點即可。

代碼

class Solution {public int countNegatives(int[][] grid) {int m = grid[0].length;int left, right = m - 1;int cnt = 0;for (int[] row : grid) {left = 0;while (left <= right) {int mid = left + (right - left >> 1);if (0 > row[mid]) {right = mid - 1;} else if (0 < row[mid]) {left = mid + 1;} else {left = mid + 1;}}cnt += m - right - 1;}return cnt;}
}

1. 兩數之和

題目鏈接

1. 兩數之和

標簽

數組 哈希表

思路

本題需要返回元素對應的索引,而不是只返回真假值,所以可以使用 Map 來存儲元素的值和索引的鍵值對,key為元素的值,value為元素的索引。每遍歷到一個元素就在 Map 中查找是否有 目標元素 減去 當前元素 的元素,如果有,則返回當前元素和這個元素的索引組成的數組;否則就把當前元素的值和索引存儲到 Map 中,遍歷下一個元素。

代碼

class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums.length; i++) {int curr = nums[i]; // 當前遍歷到的元素int need = target - curr; // 需要的元素,滿足 當前元素 + 需要元素 = 目標元素if (map.containsKey(need)) {return new int[]{i, map.get(need)};}map.put(curr, i);}return null;}
}

208. 實現 Trie (前綴樹)

題目鏈接

208. 實現 Trie (前綴樹)

標簽

設計 字典樹 哈希表 字符串

思路

本題和 二叉樹 有些類似,不過本題是以 小寫字符 作為區分子節點的標識,故應該叫 二十六叉樹,每個節點都有26個指針,分別指向從 'a''z' 的所有字符的節點。

可以把字符串想像成一串字符序列,而這個字符序列就是二十六叉樹的 一條路徑,比如對于字符串word = "apple",它的路徑就是a -> p -> p -> l -> e,按照路徑把這個字符串添加到各層節點上。這就是添加方法 void insert(String word)

在查找時,可以查找這個字符串的字符序列對應的路徑是否存在與這個二十六叉樹中,即按照這個路徑遍歷,如果有一個節點不存在,則這個字符串不存在;否則就代表字符串一定存在嗎?不一定,例如只添加了一個字符串"apple",而現在要查詢"app"是否存在。

那么就不能只保存路徑,應該還要保存字符串的結尾字符,也就是保存這個字符是否是字符串的結尾,這樣在查找時,就可以通過是否是字符串的結尾來判斷這個單詞是否存在了。這就是查詢方法boolean search(String word)

此外,還要實現boolean startsWith(String prefix)方法。這個方法就是 沒添加是否是字符串的結尾的標記前 的查找方法,只要存在這條路徑就滿足條件,返回true;否則就返回false

代碼

class Trie {private static class Node {private static final int SIZE = 26; // 字符數Node[] nexts = new Node[SIZE]; // 存儲下一字母的指針數組boolean isEnd; // 記錄本節點是否是單詞的結尾}private Node root; // 前綴樹的根節點public Trie() {root = new Node();}public void insert(String word) {char[] str = word.toCharArray();Node curr = root;for (char c : str){int idx = c - 'a'; // 獲取在指針數組中的索引if (curr.nexts[idx] == null) { // 如果這個位置沒有字符節點curr.nexts[idx] = new Node(); // 則新建一個字符節點}curr = curr.nexts[idx]; // 往下一個字符節點移動}curr.isEnd = true; // 保存該字符是字符串的最后一個字符}public boolean search(String word) {char[] str = word.toCharArray();Node curr = root;for (char c : str) {int idx = c - 'a'; // 獲取在指針數組中的索引if (curr.nexts[idx] == null) { // 如果這個位置沒有字符節點return false; // 則說明字符串不存在該樹中,返回false}curr = curr.nexts[idx]; // 往下一個字符節點移動}return curr.isEnd; // 返回這個字符是否是字符串的結尾}public boolean startsWith(String prefix) {char[] str = prefix.toCharArray();Node curr = root;for (char c : str) {int idx = c - 'a'; // 獲取在指針數組中的索引if (curr.nexts[idx] == null) { // 如果這個位置沒有字符節點return false; // 則說明該樹中的字符串不以 prefix 為前綴,返回false}curr = curr.nexts[idx]; // 往下一個字符節點移動}return true; // 該樹中一定有字符串以prefix為前綴,返回true}
}

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

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

相關文章

使用 Python 處理 Lumerical 導出的 .txt 文件(完結)

使用 Python 處理 Lumerical 導出的 .txt 文件 引言正文以 , 隔開的波長與透射率以 \t 隔開的波長與透射率引言 之前在 添加鏈接描述 一文中我們已經介紹了如何將 Lumerical 仿真中的 S 參數相關數據導出為 .txt 文件。這里我們來分享如何使用 Python 對這些數據進行處理。 正…

如果國產BI工具也有頂流,它們一定會上榜

在數據驅動的今天&#xff0c;商業智能&#xff08;BI&#xff09;工具已成為企業不可或缺的助手&#xff0c;它們通過強大的數據處理和分析能力&#xff0c;幫助企業洞察市場趨勢&#xff0c;優化運營決策。如果BI工具界也有“頂流”&#xff0c;那么奧威BI、帆軟BI&#xff0…

原生CSS變量

原生CSS 變量 css中我們可以統一設置 變量 方便頁面維護 聲明 變量聲明的時候&#xff0c;變量名之前加上兩根連詞線&#xff08;–&#xff09;即可。例如&#xff1a; 聲明的變量是有作用域的&#xff0c;比如是在html中聲明的變量&#xff0c;那么該變量在html中的任何地方都…

我國甜菜堿行業規模較大 未來行業發展前景較好

我國甜菜堿行業規模較大 未來行業發展前景較好 甜菜堿化學名稱三甲基甘氨酸&#xff0c;是一種在動植物體內廣泛存在的季銨型生物堿。它具有多種生物學功能&#xff0c;包括滲透調節、甲基供體等&#xff0c;廣泛應用于飼料、食品、醫藥和化妝品等行業。甜菜堿的提取主要來源于…

揭秘SmartEDA:電路仿真軟件如何貫穿課前課中課后,助力電子學習新紀元!

在電子設計與自動化的學習道路上&#xff0c;一款強大的電路仿真軟件往往能為學生們帶來事半功倍的效果。今天&#xff0c;我們就來深入探討一下SmartEDA這款電路仿真軟件在課前、課中、課后的全方位應用&#xff0c;看看它如何助力我們的電子學習步入新紀元&#xff01; 1、課…

直播平臺集成美顏工具詳解:視頻美顏SDK開發指南

本篇文章&#xff0c;小編將詳細介紹如何在直播平臺中集成美顏工具&#xff0c;幫助開發者更好地理解視頻美顏SDK的開發過程。 一、美顏工具的作用和原理 1.1 美顏工具的作用 美顏工具主要用于提升直播視頻的畫面質量&#xff0c;讓主播和觀眾在鏡頭前看起來更加美觀。這些功…

2024年最新ComfyUI漢化及manager插件安裝詳解!

前言 在ComfyUI文生圖詳解中&#xff0c;學習過如果想要安裝相應的模型&#xff0c;需要到模型資源網站&#xff08;抱抱臉、C站、魔塔、哩布等&#xff09;下載想要的模型&#xff0c;手動安裝到ComfyUI安裝目錄下對應的目錄中。 為了簡化這個流程&#xff0c;我們需要安裝Co…

MacOS下更新curl

蘋果自帶的curl不支持Https&#xff0c;我們可以通過curl -V看到如下結果 curl 7.72.0 (x86_64-apple-darwin18.6.0) libcurl/7.72.0 zlib/1.2.12 libidn2/2.3.7 librtmp/2.3 Release-Date: 2020-08-19 Protocols: dict file ftp gopher http imap ldap ldaps pop3 rtmp rtsp …

Linux workqueue介紹

Linux中的workqueue機制就是為了簡化內核線程的創建。通過調用workqueue的接口就能創建內核線程。并且可以根據當前系統的CPU的個數創建線程的數量&#xff0c;使得線程處理的事務能夠并行化。 工作隊列&#xff08;workqueue&#xff09;是另外一種將工作推后執行的形式。工作…

04:C語言流程控制

C語言流程控制 1、選擇結構1.1、第一種&#xff1a;if ...else / if ...else if...else1.2、第二種&#xff1a;switch case 2、循環結構2.1、第一種&#xff1a;for循環2.1、第二種&#xff1a;while循環2.2、第三種&#xff1a;do...while循環 在C語言程序里&#xff0c;一共…

為什么要考數據庫證書?

考取數據庫證書有多方面的理由和好處&#xff0c;這些好處不僅限于個人職業發展&#xff0c;也涉及到提升專業技能、增強競爭力以及獲得行業認可等方面。以下是一些主要的原因&#xff1a; 提升專業技能&#xff1a;數據庫證書考試通常要求考生掌握一定的數據庫理論知識和實踐技…

Java數據結構9-排序

1. 排序的概念及引用 1.1 排序的概念 排序&#xff1a;所謂排序&#xff0c;就是使一串記錄&#xff0c;按照其中的某個或某些關鍵字的大小&#xff0c;遞增或遞減的排列起來的操作。 穩定性&#xff1a;假定在待排序的記錄序列中&#xff0c;存在多個具有相同的關鍵字的記錄…

【vuejs】vue-router多層級路由配置以及頁面嵌套的處理

1. 多層級頁面嵌套概念 1.1 什么是多層級頁面嵌套 多層級頁面嵌套指的是在單頁面應用&#xff08;SPA&#xff09;中&#xff0c;頁面結構由多個嵌套的組件組成&#xff0c;每個組件可能代表不同的頁面或頁面區域。這種結構允許開發者將應用組織成多個模塊&#xff0c;每個模…

認證資訊|Bluetooth SIG認證

在當今高度互聯的世界中&#xff0c;無線技術的普及已經成為我們生活和工作中不可或缺的一部分。作為領先的無線通信技術之一&#xff0c;Bluetooth技術以其穩定性、便捷性和廣泛的應用場景而備受青睞。然而&#xff0c;要想在激烈的市場競爭中脫穎而出&#xff0c;獲得Bluetoo…

6、Redis系統-數據結構-04-Hash

四、哈希表&#xff08;Hashtable&#xff09; 哈希表是一種高效的鍵值對數據結構&#xff0c;通過散列函數將鍵映射到表中的位置&#xff0c;實現快速的插入、刪除和查找操作。Redis 廣泛使用哈希表來實現 Hash 對象和數據庫的鍵值存儲。以下將從結構設計、哈希沖突與鏈式哈希…

深入源碼,探究#、$號替換符的區別

在Mybatis的日常使用過程中以及在一些技術論壇上我們都能常常聽到&#xff0c;不要使用$符號來進行SQL的編寫&#xff0c;要使用#符號&#xff0c;否則會有SQL注入的風險。那么&#xff0c;為什么在使用$符號時會有注入的風險呢&#xff0c;以及#號為什么不會有風險呢&#xff…

C/C+++服務器之libuv的使用實戰

libuv libuv簡介 1: 開源跨平臺的異步IO庫, 主要功能有網絡異步&#xff0c;文件異步等。 2: libuv主頁: http://libuv.org/ 3: libuv是node.js的底層庫; 4: libuv的事件循環模型: epoll, kqueue, IOCP, event ports; 異步 TCP 與 UDP sockets; DNS 解析 異步文件讀寫; 信號處…

Python結合MobileNetV2:圖像識別分類系統實戰

一、目錄 算法模型介紹模型使用訓練模型評估項目擴展 二、算法模型介紹 圖像識別是計算機視覺領域的重要研究方向&#xff0c;它在人臉識別、物體檢測、圖像分類等領域有著廣泛的應用。隨著移動設備的普及和計算資源的限制&#xff0c;設計高效的圖像識別算法變得尤為重要。…

設計模式-結構型-08-組合模式

文章目錄 1、學校院系展示需求2、組合模式基本介紹3、組合模式示例3.1、 解決學校院系展示&#xff08;透明模式1&#xff09;3.2、高考的科目&#xff08;透明模式2&#xff09;3.3、高考的科目&#xff08;安全組合模式&#xff09; 4、JDK 源碼分析5、注意事項和細節 1、學校…

存儲過程編程-創建(CREATE PROCEDURE)、執行(EXEC)、刪除(DROP PROCEDURE)

一、定義 1、存儲過程是在SQL服務器上存儲的已經編譯過的SQL語句組。 2、存儲過程分為三類&#xff1a;系統提供的存儲過程、用戶定義的存儲過程和擴展存儲過程 &#xff08;1&#xff09;系統提供的存儲過程&#xff1a;在安裝SQL Server時&#xff0c;系統創建了很多系統存…