每周算法(week 1)【leetcode1~10】

前言

? ? ? ? 今天開始刷面試算法題,雖然之前在藍橋杯、程序設計天梯賽中拿過兩個省一和一個國三,但是基本靠的都是我對 Java 語言的熟悉,至于算法我只會基本的雙指針、快慢指針、差分數組等,最擅長的其實還是暴力。但是自認為應付面試還是遠遠不夠的,所以今天開始是該好好修煉一下算法了。

leetcode 編號完成時間復習時間
1. 兩數之和2024-06-30
2. 兩數相加2024-06-30
3. 無重復字符的最長子串2024-06-30
4. 尋找兩個正序數組的中位數2024-07-01
5. 最長回文串2024-07-01
6.?
7.
8.?
9. 回文數2024-07-02
10.?

1、兩數之和(哈希)

1.1、暴力法?

  • 思路💡:雙重遍歷,確保數組中每兩個數字都進行過一次求和,直到找到 nums[i] + nums[j] = target 的兩個目標索引
  • 時間復雜度🕖:?O(n2)
class Solution {public int[] twoSum(int[] nums, int target) {int[] res = new int[2];for(int i=0;i<nums.length-1;i++){for(int j=i+1;j<nums.length;j++){if(nums[i]+nums[j]==target){res[0]=i;res[1]=j;return res;}}}return nums;}
}

1.2、哈希表

  • 思路💡:使用一個哈希表來存儲遍歷過的元素,每次插入元素前判斷是否存在 target - nums[i]
  • 時間復雜度🕖:因為哈希表的插入和查詢操作的復雜度是 O(1),所以總的時間復雜度是 O(n)
class Solution {public int[] twoSum(int[] nums, int target) {int[] res = new int[2];Map<Integer,Integer> map = new HashMap<>();for(int i = 0; i < nums.length; i++){if(map.containsKey(target-nums[i])){res[0] = map.get(target-nums[i]);res[1] = i;return res;}else{map.put(nums[i],i);}}return nums;}
}

2、兩數相加(模擬)

?2.1、模擬算法

  • 思路💡:模擬普通列式計算的過程,用變量 t 代表當前位的計算和,則 t%10 為當前位的結果,t/10 作為下一輪計算的加數
  • 時間復雜度🕖:O(n)
class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode dummy = new ListNode(-1); // 首節點ListNode cur = dummy; // 當前節點(負責穿針引線,將每位的結果連起來)int t = 0; // 每位的計算和while(l1 !=null || l2 !=null || t!=0){if(l1!=null){t += l1.val;l1 = l1.next;}if(l2!=null){t += l2.val;l2 = l2.next;}cur.next = new ListNode(t % 10);t /= 10;cur = cur.next;}return dummy.next;} 
}

3、無重復字符的最長子串(雙指針——前后指針)

3.1、暴力法

  • 思路💡:雙重循環,遍歷每一種沒有重復字符的字符串組合
  • 時間復雜度🕖:O(n2)
class Solution {public int lengthOfLongestSubstring(String s) {if(s.length()==0 || s.length()==1) return s.length();char[] arr = s.toCharArray();int max = Integer.MIN_VALUE;for(int i=0;i<arr.length-1;i++){Map<Character,Integer> map = new HashMap<>();map.put(arr[i],1);for(int j=i+1;j<arr.length;j++){if(map.containsKey(arr[j])) break;else map.put(arr[j],1);}max = Math.max(max,map.size());}return max;}
}

3.2、前后指針?

  • 思路💡:指針 j 負責在前面探索,當哈希表中存在索引 j 的元素時,指針 i 開始移動,直到區間內沒有重復元素
  • 時間復雜度🕖:由于 i,j 均最多增加n次,且哈希表的插入和更新操作的復雜度都是 O(1)
    ,因此,總時間復雜度 O(n)
class Solution {public int lengthOfLongestSubstring(String s) {char[] arr = s.toCharArray();Map<Character,Integer> map = new HashMap<>();int res = 0;for(int i=0,j=0;j<arr.length;j++){map.put(arr[j],map.getOrDefault(arr[j],0)+1);while(map.get(arr[j]) > 1){map.put(arr[i],map.get(arr[i++])-1);}res = Math.max(res,j - i + 1);}return res;}
}

4、尋找兩個正序數組的中位數(歸并排序)

  • 思路💡:使用歸并算法將兩個數組合并
  • 時間復雜度🕖:O( n + m )n 和 m 分別是兩個數組的長度
class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int m = nums1.length;int n = nums2.length;int[] nums = new int[m+n];// 如果nums1為空,則直接返回nums2的中位數if (m == 0) {if (n % 2 == 0) {return (nums2[n / 2 - 1] + nums2[n / 2]) / 2.0;} else {return nums2[n / 2];}}// 如果nums2為空,則直接返回nums1的中位數if (n == 0) {if (m % 2 == 0) {return (nums1[m / 2 - 1] + nums1[m / 2]) / 2.0;} else {return nums1[m / 2];}}int count = 0; // 合并后的數組的索引int i = 0,j = 0; // nums1 和 nums2 的索引while(count != (m+n)){if(i == m){ // 如果數組 nums1 的元素合并完畢while(j != n){nums[count++] = nums2[j++];}break;}if(j == n){while(i != m){nums[count++] = nums1[i++];}break;}if(nums1[i] < nums2[j]){nums[count++] = nums1[i++];}else{nums[count++] = nums2[j++];}}// 到這里已經合并結束了 count=nums.lengthreturn count%2==0?(nums[count/2-1] + nums[count/2])/2.0:nums[count/2];}
}

?5、最長回文子串

5.1、雙指針 + 暴力

  • 思路💡:使用雙指針判斷字符串是否是回文串,然后使用雙重循環枚舉出每一種子串
  • 時間復雜度🕖:O( n3 )
class Solution {public String longestPalindrome(String s) {String longest = "";for(int i=0;i<s.length();i++){for(int j=i+1;j<s.length()+1;j++){String sub = s.substring(i,j);if(isPalindrome(sub)){longest = sub.length()>longest.length()?sub:longest;}}}return longest;}/*** 雙指針判斷回文串*/public boolean isPalindrome(String str){int i = 0,j = str.length()-1;while(str.charAt(i) == str.charAt(j)){if(i >= j) return true;i++;j--;}return false;}
}

5.2、 中心擴散法

  • 思路💡:暴力枚舉所有回文串的中心,然后使用中心擴散計算回文串的長度
    • 首先尋找邊界,因為回文串的中心可能不是一個字符(比如 "abba",或者 "abbba" ,這種可以統一將右指針移動到邊界)
    • 此時,左右指針都指向相同的字符,然后左右指針開始同時擴散,找到該中心最長的回文串
    • 長度 =? 右指針 - 左指針 + 1
  • 時間復雜度🕖:O(N2)
class Solution {public String longestPalindrome(String s) {int left=0,right=0;int max = 0; // 最長for(int i=0;i<s.length();i++){int subLeft = i,subRight = i;// 尋找右邊界while(subRight<s.length()-1 && s.charAt(i)==s.charAt(subRight+1)){subRight++;}// 左右擴散while(subRight<s.length()-1 && subLeft-1>=0 && s.charAt(subLeft-1)==s.charAt(subRight+1)){subLeft--;subRight++;}int len = subRight - subLeft + 1;if(len > max){left = subLeft;right = subRight;max = len;}}return s.substring(left,right+1);}
}

?6、Z 字形變換

感覺這種題對面試沒意義,跳過

7、整數反轉

純數學題,跳過

8、字符串轉換整數

純模擬題,這類題做太多了,基本通過了,剩下個別一兩個用例懶得寫了,意義不大。

這里寫一下從中學到的一點,從來沒相關在算法里 try-catch 不過還挺好用的:

        try{if(Long.parseLong(sb.toString())< Integer.MIN_VALUE){return Integer.MIN_VALUE;}else if(Long.parseLong(sb.toString()) > Integer.MAX_VALUE){return Integer.MAX_VALUE;}}catch(Exception e){return 0;}

9、回文數

  • 思路💡:雙指針
  • 時間復雜度🕖:O(N)
class Solution {public boolean isPalindrome(int x) {String s = String.valueOf(x);int i = 0,j = s.length()-1;while(s.charAt(i) == s.charAt(j)){if(i>=j)    return true;i++;j--;}return false;}
}

10、正則表達式

  • 思路💡沒有思路,純模擬,而且是最難的模擬
  • 時間復雜度🕖:

果斷放棄,之后有思路了 再來

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

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

相關文章

Kimi 上下文緩存功能開啟公測!降低使用費用,加快模型相應速度

7月2日&#xff0c;系統之家發布消息&#xff0c;月之暗面科技有限公司旗下的Kimi開放平臺正式推出上下文緩存功能&#xff0c;并已開放公測。這項功能專為處理頻繁請求和大量重復引用初始上下文的場景設計&#xff0c;能有效降低使用長文本模型的成本&#xff0c;并顯著提升處…

基于java+springboot+vue實現的旅游管理系統(文末源碼+Lw)227

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本旅游管理系統就是在這樣的大環境下誕生&#xff0c;其可以幫助使用者在短時間內處理完畢龐大的數據信息&a…

HMM,EM算法(Expectation-Maximization Algorithm) VAE)以及KL散度

HMM&#xff0c;EM算法&#xff08;Expectation-Maximization Algorithm&#xff09; VAE&#xff09;以及KL散度 最大化對數似然&#xff08;或稱為最大化對數似然函數&#xff09;是在統計學中用來估計模型參數的一種常用方法。其基本思想是找到一組參數值&#xff0c;使得在…

本地文本向量模型的部署提供兼容openai的接口

前言 之前部署了fastgpt官方文檔的一個,提供的一個m3e-large的向量模型打包的docker鏡像,雖然使用起來整體效果還可以,但是有些文本向量相似度匹配的結果還是不太滿意的,目前,網絡上層出不窮的帶推理文本向量,想體驗一下,于是我基于modelscope庫封裝了一個兼容open ai的…

探索視覺世界:深入了解目標檢測算法的奧秘

目標檢測算法 一、介紹目標檢測算法的背景和意義1.1 目標檢測的定義和應用場景1.2 目標檢測算法的發展歷程 二、目標檢測算法分類2.1 傳統目標檢測算法2.1.1 基于分類器的目標檢測算法2.1.2 基于模板匹配的目標檢測算法 2.2 深度學習目標檢測算法2.2.1 兩階段目標檢測算法2.2.2…

Android Gradle 開發與應用 (四): 多模塊構建與組件化,提升Android開發效率的途徑

目錄 1. 多模塊構建的基本概念 2. 組件化的基本概念 3. 多模塊構建與組件化的優勢 4. 多模塊構建的實現方法 5. 組件化的實現方法 6. 多模塊構建與組件化的實踐 7. 案例分析 8. 未來展望 結語 隨著移動應用的功能日益復雜&#xff0c;單一模塊開發方式的弊端愈加明顯。…

全國范圍內嚴格推行雙休制才是勞動力使用方面面向未來和可持續發展的

我有以下理由&#xff1a; 合法依規 每天不超8小時、每周不超過40小時&#xff0c;這是國務院令第146號&#xff0c;很多年前就明確要求的&#xff0c;在國有企業和事業單位也早就推行了很多年的&#xff1b;對確有實際需要的崗位&#xff0c;也有經過行政審批的“不定時工作…

2024年廣東省食品安全管理員考試精選練習題庫

76.已具有主體資格的企業申請食品流通可&#xff0c;該企業的&#xff08;&#xff09;為可申請人。 A.投資者 B.經營負責人 C.本身 答案&#xff1a;C 77.食用亞硝酸鹽的銷售只面向&#xff08;&#xff09;。 A.食品生產加工行業 B.餐飲業 C.食品流通單位 答案&…

微軟賬戶和本地賬戶有什么區別?如何切換登錄賬戶?

Windows 操作系統是目前世界上比較流行的操作系統之一&#xff0c;在使用 Windows 系統的時候都需要我們進行登錄&#xff0c;其中我們可以使用微軟賬戶或者本地賬戶進行登錄&#xff0c;那本地賬戶和微軟賬戶有什么區別&#xff1f;下面就帶大家了解一下微軟賬戶和本地賬戶。 …

基于機器學習的零售商品銷售數據預測系統

1 項目介紹 1.1 研究目的和意義 在電子商務日益繁榮的今天&#xff0c;精準預測商品銷售數據成為商家提升運營效率、優化庫存管理以及制定營銷策略的關鍵。為此&#xff0c;開發了一個基于深度學習的商品銷售數據預測系統&#xff0c;該系統利用Python編程語言與Django框架&a…

惠海 H6900B 2.7V3.7V4.2V5V9V升12V24V48VLED升壓恒流芯片IC

惠海H6900B LED升壓恒流芯片IC是一款功能豐富的LED驅動解決方案&#xff0c;為高亮度LED燈串設計。以下是針對該產品的進一步分析和解釋&#xff1a; 產品特點 高效率&#xff1a;高達95%以上的效率意味著在驅動LED時&#xff0c;只有很少的能量轉化為熱量&#xff0c;從而提…

Docker常用指令。(工作中用到的)

文章目錄 Docker常用指令重啟docker容器查看運行結果查看文件并跳轉到指定行數查看容器日志創建容器交互式的方式創建容器后臺式創建容器 退出容器 Docker常用指令 docker ps # 列出所有運行的容器 docker ps -a # 列出所有的容器 docker exec -it containerId或containerName …

SolidityFoundry 安全審計測試 memory濫用

名稱&#xff1a; memory濫用 https://github.com/XuHugo/solidityproject/tree/master/vulnerable-defi 描述&#xff1a; 在合約函數中濫用storage和memory。 memory是一個關鍵字&#xff0c;用于臨時存儲執行合約所需的數據。它保存函數的參數數據&#xff0c;并在執行后…

xcrun: error: unable to find utility “simctl“, not a developer tool or in PATH

目錄 前言 一、問題詳情 二、解決方案 1.確認Xcode已安裝 2.安裝Xcode命令行工具 3.指定正確的開發者目錄 4. 確認命令行工具路徑 5. 更新PATH環境變量 前言 今天使用cocoapods更新私有庫的時候&#xff0c;遇到了"xcrun: error: unable to find utility &…

hadoop集群部署【二】YARN MapReduce 的部署

提前注意&#xff1a;請注意路徑是否和我的相同&#xff0c;放置的位置不同&#xff0c;請修改標紅處 HDFS部署 HDFS介紹及部署http://t.csdnimg.cn/Q3H3Y 部署說明 Hadoop HDFS分布式文件系統&#xff0c;我們會啟動&#xff1a; NameNode進程作為管理節點 DataNode進程…

歡太主題商店 官方資源提取與應用第三方資源方法一覽

前言疊甲&#xff1a;支持正版&#xff0c;尊重他人勞動成果&#xff0c;反對盜版提取&#xff0c;不要傳播提取版&#xff0c;我本人也在支持正版&#xff0c;但是最近懶得用主題&#xff0c;用一段時間的默認吧&#xff0c;如有主題開發者不滿&#xff0c;請聯系刪除 &#x…

JAVA 判斷一系列區間值有沒有重疊

判斷一系列區間值比喻 0-20 10-8 21-100 ...等等 這些區間有沒有重疊的方法&#xff1a; /*** Author Minco* Date 15:44 2024-07-01* Description 區間范圍*//***/ public class Interval implements Comparable<Interval> {double start;double end;public Interval(…

機器人入門路線及參考資料(機器人操作方向)

機器人&#xff08;操作方向&#xff09;入門路線及參考資料 前言1 數理基礎和編程2 機器人學理論3 計算機視覺4 機器人實操5 專攻方向總結Reference: 前言 隨著機器人和具身智能時代的到來&#xff0c;機器人越來越受到大家的重視&#xff0c;本文就介紹了機器人&#xff08;…

基于SpringBoot民宿管理系統設計和實現(源碼+LW+調試文檔+講解等)

&#x1f497;博主介紹&#xff1a;?全網粉絲10W,CSDN作者、博客專家、全棧領域優質創作者&#xff0c;博客之星、平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰?&#x1f497; &#x1f31f;文末獲取源碼數據庫&#x1f31f; 感興趣的可以先收藏起來&#xff0c;…

13-4 GPT-5:博士級AI,人工智能的新時代

圖片來源&#xff1a;AI Disruptive 人工智能世界正在迅速發展&#xff0c;新的創新和突破層出不窮。在本文中&#xff0c;我們將深入探討最新的進展&#xff0c;從即將推出的 GPT-5 模型到 Apple 和 Meta 之間可能的合作。 GPT-5&#xff1a;博士級別的人工智能 雖然尚未正…