代碼隨想錄算法訓練營第六天| 242. 有效的字母異位詞、349. 兩個數組的交集、202. 快樂數、1. 兩數之和

哈希表理論基礎

[LeetCode] 242. 有效的字母異位詞

[LeetCode] 242. 有效的字母異位詞 文章解釋

[LeetCode] 242. 有效的字母異位詞 視頻解釋

題目:

給定兩個字符串 st ,編寫一個函數來判斷 t 是否是 s 的字母異位詞。

注意:若?st?中每個字符出現的次數都相同,則稱?st?互為字母異位詞。

示例?1:

輸入: s = "anagram", t = "nagaram"
輸出: true

示例 2:

輸入: s = "rat", t = "car"
輸出: false

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • st?僅包含小寫字母

進階:?如果輸入字符串包含 unicode 字符怎么辦?你能否調整你的解法來應對這種情況?

自己看到題目的第一想法

??? 因為前一晚先看了視頻, 加上之前自己實現過, 所以印象挺深的.

看完代碼隨想錄之后的想法

??? 使用數組做哈希表, 哈希表的索引為字母在 26 個字母表的位置, 這樣可以提高搜索的速度.

// 方案一: 這個方案對于 characterCount 中的數據做的剪發操作會比方案二多不少
// 因此在大量隨機輸入的情況下效率沒有方案二高
class Solution {public boolean isAnagram(String s, String t) {if (s == null || t == null || s.length() != t.length()) {return false;}int[] characterCount = new int[26];for (int i = 0; i < s.length(); i++) {characterCount[s.charAt(i) - 'a']++;characterCount[t.charAt(i) - 'a']--;}for (int i = 0; i < characterCount.length; i++) {if (characterCount[i] != 0) {return false;}}return true;}
}
// 方案二
class Solution {public boolean isAnagram(String s, String t) {if (s == null || t == null || s.length() != t.length()) {return false;}int[] characterCount = new int[26];for (int i = 0; i < s.length(); i++) {characterCount[s.charAt(i) - 'a']++;}for (int i = 0; i < t.length(); i++) {characterCount[t.charAt(i) - 'a']--;if (characterCount[t.charAt(i) - 'a'] < 0) {return false;}}return true;}
}

自己實現過程中遇到哪些困難

??? 如果按照視頻里的解法, 效率好像會稍微低一些, 將判斷是否異位詞的邏輯修改成每次對第二個字符串中的字符, 每減一就判斷一次, 這樣可以減少一些減法操作, 效率提升了一些.

[LeetCode] 349. 兩個數組的交集

[LeetCode] 349. 兩個數組的交集 文章解釋

[LeetCode] 349. 兩個數組的交集 視頻解釋

題目:

給定兩個數組?nums1?和?nums2 ,返回 它們的交集 。輸出結果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結果的順序

示例 1:

輸入:nums1 = [1,2,2,1], nums2 = [2,2]
輸出:[2]

示例 2:

輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出:[9,4]
解釋:[4,9] 也是可通過的

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

自己看到題目的第一想法

??? 兩個 for 循環, 再將相等的數據放到 Set 集合里.

看完代碼隨想錄之后的想法

??? 通過 Set 保存一個數組的數據, 再通過另一個遍歷另一個數組將同時出現在被遍歷數組和 Set 中的數字, 保存到結果中并返回.

class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer> comparedSource = new HashSet<>();for (int i = 0; i < nums1.length; i++) {comparedSource.add(nums1[i]);}List<Integer> result = new ArrayList<>();for (int i = 0; i < nums2.length; i++) {if (comparedSource.remove(nums2[i])) {result.add(nums2[i]);}}int[] resultArray = new int[result.size()];for (int i = 0; i < result.size(); i++) {resultArray[i] = result.get(i);}return resultArray;}
}

自己實現過程中遇到哪些困難

??? Java 的 List<Integer> 轉為 int[] 沒找到合適的 API.

[LeetCode] 202. 快樂數

[LeetCode] 202. 快樂數 文章說明

題目:

編寫一個算法來判斷一個數 n 是不是快樂數。

「快樂數」?定義為:

  • 對于一個正整數,每一次將該數替換為它每個位置上的數字的平方和。
  • 然后重復這個過程直到這個數變為 1,也可能是 無限循環 但始終變不到 1。
  • 如果這個過程 結果為?1,那么這個數就是快樂數。

如果 n快樂數 就返回 true ;不是,則返回 false

示例 1:

輸入:n = 19
輸出:true
解釋:(左邊的數表示底數, 右邊的數表示指數, 1^2則表示1的平方)
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

示例 2:

輸入:n = 2
輸出:false

提示:

  • 1 <= n <= 231 - 1

自己看到題目的第一想法

??? 1. 為什么一個整數的每個位置的數平方后, 再把這些平方值相加. 最終不是得到1, 就是得到一個循環的過程呢? 算了, 題目這么說就這么信吧!

??? 2. 既然會出現循環, 那就不能讓程序出現死循環. 所以我要記錄住每個數字拆解后出現的序列(這里就是愚蠢的開始), 如果后續再出現這個序列, 我就要終止比對. 如果出現需要判斷一個對象是否出現在列表里, 就要考慮用哈希表! 我懂! 每個序列有長度, 我把相同長度的序列放在Map的同一個索引下, 與是愚蠢的 List<Integer, List<List<Integer>>> 出現了. 當然后面就越寫越奇怪, 越寫越亂.

??? 3. 在第2步的愚蠢之下, 迎來了意思曙光. 不管是 212、 122 還是 221, 如果出現循環的話, 最終一定會回到2^2+1^1+2^2=5, 所以只要5重復出現, 就表示循環了. 所以我要記錄的只是所有數的平方和是否重復出現就可以了... 這么簡單的道理我到底在復雜些什么?

看完代碼隨想錄之后的想法

??? 如我看到題目的第一想法的第3步, 基本沒有太多差別了. 算法的精妙就在于, 一旦想明白, 就會覺得豁然開朗以及否定自我. 為什么我會如此愚蠢呢, 這么簡單的事情都沒想到.

class Solution {public boolean isHappy(int n) {Set<Integer> squareSum = new HashSet<>();while ((n = getNumber(n)) != 1) {if (!squareSum.add(n)) {return false;}}return true;}private int getNumber(int number) {int result = 0;int currentNumber;while (number > 0) {currentNumber = number - (number/10)*10;result += currentNumber * currentNumber;number /= 10;}return result;}
}

自己實現過程中遇到哪些困難

??? 想明白了就很簡單了, 沒有遇到判斷條件不確定等問題.

[LeetCode] 1. 兩數之和

[LeetCode] 1. 兩數之和 文章解釋

[LeetCode] 1. 兩數之和 視頻解釋

題目:

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

你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案里不能重復出現。

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

示例 1:

輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

輸入:nums = [3,2,4], target = 6
輸出:[1,2]

示例 3:

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

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只會存在一個有效答案

進階:你可以想出一個時間復雜度小于 O(n2) 的算法嗎?

自己看到題目的第一想法?

??? 嗯... 雖然看了視頻, 依舊會看到之前自己的解答. 果然是爽循環 O(n^2) 的暴力解法.

看完代碼隨想錄之后的想法

??? x + y = z, 已知 z 和 y 的條件下, x 可知. 所以問題退化成尋找 x 是否在數組中出現. 當需要判斷一個對象是否在數組中出現的時候, 考慮哈希表. 這里需要返回對應數字的下表, 因此需要用 Map, 將數字和數字所在的下標做一個映射.

class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> existsNumbers = new HashMap<>();int[] result = new int[2];for (int i = 0; i < nums.length; i++) {if (existsNumbers.containsKey(target - nums[i])) {result[0] = existsNumbers.get(target - nums[i]);result[1] = i;return result;} else {existsNumbers.put(nums[i], i);}}return result;}
}

自己實現過程中遇到哪些困難

??? 無

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

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

相關文章

JavaEE技術之SpringCloud(Nacos注冊中心、Nacos配置中心、Sentinel實現熔斷與限流)

文章目錄 SpringCloud Alibaba1、簡介1.1 背景1.2 Nacos主要功能1.3 Nacos和SpringBoot、SpringCloud版本選擇 2、Nacos注冊中心2.1 案例準備2.2 Nacos注冊中心下載啟動2.2.1 下載2.2.2 解壓啟動2.2.3 nacos-server訪問測試 2.3 nacos注冊中心客戶端整合2.3.1 訂單服務整合naco…

YTU 3166 共享單車 DFS 記憶化搜索

問題 D: 共享單車 題目描述 共享單車走進煙臺&#xff0c;小明決定嘗試。小明啟動共享單車 App&#xff0c;輕松地找到附近的單車。那么問題來了&#xff0c;到最近的那輛單車&#xff0c;小明大約要走多少米呢&#xff1f; 現在簡化問題。將地圖設定成一個由 100100 米的像…

【UE】仿原神實現無限道路延伸的開場效果

目錄 效果 步驟 一、無限生成磚塊 二、制作門 三、停止移動并生成門 四、進入門 效果 步驟 一、無限生成磚塊 1. 新建一個Basic關卡&#xff0c;再新建一個Pawn類&#xff0c;這里命名為“BP_MyPawn” 打開“BP_MyPawn”&#xff0c;添加一個膠囊體碰撞組件和一個攝像…

工器具管理(基于若依)

文章目錄 前言一、工器具管理項目總覽 二、入庫功能1. 前端1.1 界面展示1.2 具體操作實現1.3 js文件 2. 后端2.1 工器具信息回顯2.2 工器具入庫 三、領用功能1. 前端1.1 界面展示1.2 具體實現操作1.3 js文件 2. 后端2.1 工器具信息回顯2.2 工器具領用 遇到的問題1. 同一頁面展示…

pat乙1033-舊鍵盤打字

1測試點2&#xff1a; 輸入的字符串如果為空&#xff0c;要用getline(cin,s)&#xff0c;而不是cin>>s&#xff0c;否則程序做不了 2題目說的如果上鍵壞了那大寫字母打印不了&#xff0c;不是大寫轉小寫打印啦&#xff0c;認真讀題 3兩個for循環長這樣&#xff0c;break…

基于springboot+vue的自習室管理和預約系統(全套)

一、系統架構 前端&#xff1a;vue | element-ui | html 后端&#xff1a;springboot | mybatis-plus 環境&#xff1a;jdk1.8 | mysql | maven | nodejs 二、代碼及數據庫 三、功能介紹 01. web端-首頁1 02. web端-首頁2 03. web端-注冊 04. web端-登錄 05. w…

牛客Linux高并發服務器開發學習第六天

目錄相關函數 學習進度&#xff1a; Linux系統編程入門 06&#xff1a;59&#xff1a;42

Apollo9.0 Control模塊算法源碼學習

參考資料 Apollo控制算法_嗶哩嗶哩_bilibili

Python自動化測試 | 如何使用Robot Framework進行自動化測試?

你還在手動測試&#xff1f;不妨了解一下更高效、準確且簡單的測試方法——使用Python的Robot Framework進行自動化測試。 什么是Robot Framework&#xff1f; Robot Framework是一款開源的Python自動化測試框架&#xff0c;它基于關鍵字驅動的思想&#xff0c;具有易讀、易擴…

每日一題 城市群的數量

題目解析 城市群數量_牛客題霸_牛客網 當解決這個問題時&#xff0c;首先需要理解題目要求。題目中給出了一個城市之間的鄰接矩陣&#xff0c;矩陣中的元素表示城市之間是否直接相連。如果兩個城市直接相連&#xff0c;或者通過其他城市間接相連&#xff0c;它們就屬于同一個城…

算法學習筆記(匈牙利算法)

匈牙利算法可以求解二分圖的最大匹配問題&#xff08;二分圖&#xff1a;如果無向圖 G ( V , E ) G (V, E) G(V,E)的所有點可以分為兩個集合 V 1 、 V 2 V_1、V_2 V1?、V2?&#xff0c;所有的邊都在 V 1 V_1 V1?和 V 2 V_2 V2?之間&#xff0c;而 V 1 V_1 V1?或 V 2 V_2…

深入理解Python的類,實例和type函數

問題起源&#xff1a; class t():pass s1 t() s2 type("Student2",(),{}) isinstance(s1, type), isinstance(s2, type)為什么第一個是false&#xff0c;第二個是true呢 根因定位&#xff1a; 在Python中&#xff0c;一切皆對象&#xff0c;類是對象&#xff0c…

nacos在沒有指定數據源的情況下默認使用什么數據庫?

在沒有特別指定數據源的情況下&#xff0c;Nacos 默認使用內嵌的數據庫 Derby 來存儲其數據。Derby 是一個輕量級的、基于 Java 的數據庫管理系統&#xff0c;適合于開發和測試環境&#xff0c;因為它簡單易部署且無需額外的數據庫服務器。然而&#xff0c;對于生產環境&#x…

使用ORM快速獲取業務對象列表

通常在實際開發中&#xff0c;業務對象的信息是需要來自多個數據表的。 我們如果想要獲取這個業務對象&#xff0c;就要先查詢數據表&#xff0c;再把查詢到的數據依次循環&#xff0c;組合轉換封裝成業務要使用的對象類型列表。 如果使用了ORM&#xff0c;那么這個過程就可以簡…

Stability AI 推出 Stable Artisan,終于可以在Discord上使用Stable Diffusion了!

Stable Diffusion 社區最常見的要求之一是能夠直接在 Discord 上使用他們的模型。近期&#xff0c;Stability AI 推出 Stable Artisan&#xff0c;這個需求終于被實現了。 Stable Artisan 支持在 Discord 上生成媒體&#xff0c;由 Stability AI 的尖端圖像和視頻模型 Stable D…

基于Springboot的實習生管理系統(有報告)。Javaee項目,springboot項目。

演示視頻&#xff1a; 基于Springboot的實習生管理系統&#xff08;有報告&#xff09;。Javaee項目&#xff0c;springboot項目。 項目介紹&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三層體系結構&a…

mysql group by使用方法實例講解

MySQL中GROUP BY語句用于對某個或某些字段查詢分組&#xff0c;并返回重復記錄的第一條&#xff0c;本文章通過實例向大家介紹mysql group by使用方法和需要注意的地方&#xff0c;感興趣的朋友可以參考一下。 現在有這樣一個數據表book idfirst_namelast_namecityage1JasonM…

知乎知+廣告推廣該如何做?怎么收費?

知乎作為一個匯聚高質量用戶群體的知識分享平臺&#xff0c;成為了眾多品牌和產品推廣的優選之地。特別是知乎的“知”廣告推廣服務&#xff0c;以其精準定向、內容原生的特點&#xff0c;深受廣告主青睞。 一、知乎知廣告推廣基礎 1. 什么是知乎知&#xff1f; 知是知乎官方…

C++初階學習第七彈——探索STL奧秘(二)——string的模擬實現

標準庫中的string&#xff1a;C初階學習第六彈——string&#xff08;1&#xff09;——標準庫中的string類-CSDN博客 前言&#xff1a; 在前面我們已經學習了如何使用標準庫中的string類&#xff0c;但作為一個合格的程序員&#xff0c;我們不僅要會用&#xff0c;還要知道如…

C++類和對象下——實現日期類

前言 在學習了類和對象的六大成員函數后&#xff0c;為了鞏固我們學習的知識可以手寫一個日期類來幫助我們理解類和對象&#xff0c;加深對于其的了解。 默認函數 構造函數 既然是寫類和對象&#xff0c;我們首先就要定義一個類&#xff0c;然后根據實際需要來加入類的數據與函…