JS.Day2-堆選(Py)/三路快排-快速選擇-215,11,560,21,128,20,121

目錄

215.找第k大元素

三路的快速排序

快速選擇

法2.堆選

(堆排序)

11.盛更多水的容器

代碼1

代碼2

560.和為K的子數組(題意!)

慣性思維

正解

21.合并生序鏈表

遞歸寫法

128.最長連續序列

20.有效的括號

面試的時候不好好審題,太急,直接慣性思維用三個棧了

121.買賣股票的最佳時機


215.找第k大元素

那么這道題想要時間復雜度低,肯定是不能全部排序的

先來講講

三路的快速排序

三路快排在兩路的基礎上加上了=的部分,

為了處理全部元素相同的特殊情況

總的來說就是通過三個指針維護 左邊<、中間=、右邊>?

如下圖的左上角所示

?JS代碼如下

function quickSort3Way(arr, left = 0, right = arr.length - 1) {if (left >= right) return;let lt = left;         // 小于區域的右邊界let gt = right;        // 大于區域的左邊界let pivot = arr[left]; // 選取第一個元素為基準let i = left + 1;      // lt 至 gt 中、=pivot右邊、的當前正在判斷的位置while (i <= gt) {if (arr[i] < pivot) {[arr[lt], arr[i]] = [arr[i], arr[lt]];lt++;i++;//原本lt位置是=pivot的,所以<分支中可以直接i++判斷下一個} else if (arr[i] > pivot) {[arr[i], arr[gt]] = [arr[gt], arr[i]];gt--;} else {i++;//而gt位置是未知的,不能i++}}quickSort3Way(arr, left, lt - 1);quickSort3Way(arr, gt + 1, right);
}let nums = [3, 5, 2, 3, 1, 3, 4, 2, 3];
quickSort3Way(nums);
console.log(nums);

注意:

//原本lt位置是=pivot的,所以<分支中可以直接i++判斷下一個?

//而gt位置是未知的,不能i++

快速選擇

快速選擇就是在快速排序的基礎上,對于最后的部分進行判斷分支剪枝,從而只進行必要的排序

if (k_smallset<ls){return quickSelect(arr,left,lt-1,k_smallest);
}else if{return quickSelect(arr,gt+1,right,k_smallest);
}else{return arr[lf];
}

法2.堆選

JS中沒有內置堆模塊,python自帶了,而且還有兩個(heapq、PriorityQueue)

通過最小堆找第k大(用最大堆的話得維護所有元素且彈k次)

將數組壓入堆,維護至最大的k個元素(有多于k個:彈出最小的也就是彈出堆頂),那么堆頂就是第k大

import heapqdef findKthLargest(nums, k):heap = []for num in nums:heapq.heappush(heap, num)if len(heap) > k:heapq.heappop(heap)return heap[0]

(堆排序)

堆排序就是一直 heappop

import heapqdef heap_sort(nums):heapq.heapify(nums)  # O(n) 建堆res = [heapq.heappop(nums) for _ in range(len(nums))]return res

11.盛更多水的容器

var maxArea = function(height) {let ans=0;for(let l=0;l<height.length-1;l++){let r=height.length-1;let hnow=0;while(r>l){if (height[r]>hnow){ans=Math.max(ans,(r-l)*Math.min(height[l],height[r]));hnow=height[r];}r--;//方向會影響}}return ans;
};

上面我的第一次貪心效果并不是很好

實際上:由于雙指針往中間時 d小了,只有 h大 才可能S大

只需要在 h 更大的時候才需要更新 ans?

具體細節:短板效應-那邊更小動那邊

代碼1

var maxArea = function(height) {let ans = 0, left = 0, right = height.length - 1;while (left < right) {const area = (right - left) * Math.min(height[left], height[right]);ans = Math.max(ans, area);if (height[left] < height[right]) {left++;} else {right--;}}return ans;
};

代碼2

var maxArea=function(height){let l=0;let r=height.length-1;let lh=height[l];let rh=height[r];let ans=(r-l)*Math.min(lh,rh);while(l<r){if (lh<rh){l++;lnow=height[l];if(lnow>lh){lh=lnow;ans=Math.max(ans,(r-l)*Math.min(lh,rh));}}else{r--;rnow=height[r];if(rnow>rh){rh=rnow;ans=Math.max(ans,(r-l)*Math.min(lh,rh));}}}return ans;
}

看上去代碼能節省更新 ans 的次數,但是實際上 代碼1更快

簡潔的代碼更強健

560.和為K的子數組(題意!)

不急
上來就寫了一發DFS,但是題意是連續子數組

慣性思維

var subarraySum = function(nums, k) {let ans = [];function dfs(step, sum, choice) {if (sum === k) {ans.push([...choice]);  // 通過展開運算符,拷貝,避免后續更改}if (step === nums.length) {return;}choice.push(nums[step]);dfs(step + 1, sum + nums[step], choice);choice.pop();  // 直接pop,恢復現場dfs(step + 1, sum, choice);}dfs(0, 0, []);return ans;
};

正解

連續:前綴和

通過 哈希表 優化:找目標

var subarraySum = function(nums, k) {let count = 0;let sum = 0;let map = new Map();map.set(0, 1);  // 前綴和為0出現1次for (let num of nums) {sum += num;if (map.has(sum - k)) {count += map.get(sum - k);}map.set(sum, (map.get(sum) || 0) + 1);}return count;
};

(map.get(sum) || 0) 通過或語句將未出現時的 undifined 轉為 0

21.合并生序鏈表

一看就是雙指針

注意力扣的鏈表類

/*** Definition for singly-linked list.* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }

當最后一方沒有時,返回另一方,直接接在答案后面即可

遞歸寫法

var mergeTwoLists = function(l1, l2) {if (l1 === null) {return l2;} else if (l2 === null) {return l1;} else if (l1.val < l2.val) {l1.next = mergeTwoLists(l1.next, l2);return l1;} else {l2.next = mergeTwoLists(l1, l2.next);return l2;}
};

復雜度比下面的迭代要好

var mergeTwoLists = function(l1, l2) {const prehead = new ListNode(-1);let prev = prehead;while (l1 != null && l2 != null) {if (l1.val <= l2.val) {prev.next = l1;l1 = l1.next;} else {prev.next = l2;l2 = l2.next;}prev = prev.next;}prev.next = l1 === null ? l2 : l1;return prehead.next;
};

128.最長連續序列

Set去重后

通過哈希表判斷連續

var longestConsecutive=function(nums){const st=new Set(nums);let ans=0;for(const x of st){//注意下面用的都是stif(st.has(x-1)){continue;//上一個一定已經判斷過了}let y=x+1;while(st.has(y)){y++;}ans=Math.max(ans,y-x);}return ans;
}

20.有效的括號

面試的時候不好好審題,太急,直接慣性思維用三個棧了

但是這怎么能三個棧呢,題目里面說了是正確的閉合,也就是 [ ( ] ) 是錯的

直接開一個就夠了

然后用哈希表優化邏輯

var isValid = function(s) {if (s.length % 2) { // s 長度必須是偶數return false;}const mp = {'(': ')', '[': ']', '{': '}'};const st = [];for (const c of s) {if (mp[c]) { // c 是左括號st.push(mp[c]); // 入棧} else if (st.length === 0 || st.pop() !== c) { // c 是右括號return false; // 沒有左括號,或者左括號類型不對}}return st.length === 0; // 所有左括號必須匹配完畢
};

121.買賣股票的最佳時機

維護之前最小值這一變量

var maxProfit = function(prices) {let ans=0;let min=prices[0];for(let i=1;i<prices.length;i++){let d=prices[i]-min;ans=Math.max(ans,d);if(prices[i]<min){min=prices[i];}}return ans;
};

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

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

相關文章

第8章 處理幾何圖形 面向 ArcGIS的Python腳本編程

一、折點坐標(.txt 或 .xlsx 或 .xls) > 點線面圖層(.shp) &#xff08;一&#xff09;.xlsx 或 .xls > .shp 新建一個文件夾&#xff0c;連接到該文件夾&#xff0c;并將其設置為工作空間 在該文件夾下&#xff0c;新建一個pts.xlsx的文件&#xff0c;并輸入下圖內容 …

使用(h3.js)繪制六角網格碼

今天來記錄一篇關于h3.js插件庫的使用&#xff0c;他可以很高效的計算出地球上某個經緯度坐標六邊形頂點。 前段時間領導突然給我個售前功能&#xff0c;要求是使用h3.js插件在地球上繪制出六邊形網格碼&#xff0c;本來以為挺棘手的&#xff0c;結果看完文檔后發現也挺簡單的…

GO 1.25

Go 1.25 發布說明&#xff08;草案&#xff09; Go 1.25 尚未發布。 本文檔是正在編寫中的發布說明。Go 1.25 預計于 2025 年 8 月發布。 語言變更 Go 1.25 中沒有影響 Go 程序的語法變更。然而&#xff0c;在語言規范中&#xff0c;“核心類型”&#xff08;core types&…

解析Android SETUP_DATA_CALL 鏈路信息字段

Android 對象返回的log信息經常都不是標準的JSON字符串,排查字段不直觀,比如下面的日志: 06-13 15:56:36.204 8076 8407 D RILJ : [1655]> SETUP_DATA_CALL,reason=NORMAL,accessNetworkType=EUTRAN,dataProfile=[DataProfile=[ApnSetting] IMS, 2318, 310260, ims,…

跨語言RPC:使用Java客戶端調用Go服務端的HTTP-RPC服務

在構建分布式系統時&#xff0c;實現不同編程語言之間的無縫通信是一個常見的需求。本文將詳細介紹如何使用Go語言創建一個HTTP-RPC服務&#xff0c;并通過Java客戶端進行遠程調用。我們將探索整個過程&#xff0c;包括服務端的實現、客戶端的編寫以及測試驗證。 一、背景介紹…

CVPR2024遷移學習《Unified Language-driven Zero-shot Domain Adaptation》

摘要 本文提出了一個名為 Unified Language-driven Zero-shot Domain Adaptation&#xff08;ULDA&#xff09;的新任務設置&#xff0c;旨在使單一模型能夠適應多種目標領域&#xff0c;而無需明確的領域標識&#xff08;domain-ID&#xff09;知識。現有語言驅動的零樣本領域…

AI安全風險監測平臺:全周期防護體系構建

AI安全風險監測平臺通過構建全生命周期防護體系&#xff0c;實現對人工智能系統研發、部署、運行、迭代各階段的安全風險動態監測。該平臺融合算法審計、行為分析、合規驗證等核心能力&#xff0c;建立覆蓋模型安全、數據安全、應用安全的立體防御網絡&#xff0c;為智能系統提…

數據集-目標檢測系列- 杯子 數據集 bottle >> DataBall

數據集-目標檢測系列- 杯子 數據集 bottle &#xff1e;&#xff1e; DataBall 貴在堅持&#xff01; * 相關項目 1&#xff09;數據集可視化項目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2&#xff09;數據集訓練、推理相關…

視頻點播web端AI智能大綱(自動生成視頻內容大綱)的代碼與演示

通過AI技術將視頻課程自動生成結構化大綱和摘要&#xff0c;支持PPT教學視頻、企業內訓等場景應用。核心功能包括&#xff1a;自動匹配視頻知識點生成文本大綱、快速內容定位、降低課程制作成本。系統采用模塊化架構&#xff0c;包含Vue2.7前端組件、JS邏輯庫和演示項目&#x…

Linux: errno: EINPROGRESS-115

在connect接口的使用說明里&#xff0c;有這個錯誤&#xff1a;EINPROGRESS。 The socket is nonblocking and the connection cannot be completed immediately. It is possible to select(2) or poll(2) for completion by selecting the socket for writing. After select(2…

Node.js特訓專欄-基礎篇:3. Node.js內置模塊的使用

&#x1f525; 歡迎來到 Node.js 實戰專欄&#xff01;在這里&#xff0c;每一行代碼都是解鎖高性能應用的鑰匙&#xff0c;讓我們一起開啟 Node.js 的奇妙開發之旅&#xff01; Node.js 特訓專欄主頁 Node.js內置模塊&#xff1a;強大功能的基石 在Node.js的世界里&#xff…

基于MATLAB實現的Capon、MUSIC、ESPRIT和PM算法進行DOA

使用Capon、MUSIC、ESPRIT和PM多種算法進行doa估計&#xff0c;通過譜峰搜索函數估計到達角&#xff0c;并使用蒙特卡洛方法估計各算法的RMSE。&#xff08;可能計算時間較長&#xff0c;如需節省時間可以減小蒙特卡洛次數&#xff09; PM.m , 574 RMSE.m , 274 TLS_ESPRIT.m …

某網站極驗4滑塊驗證碼逆向分析

文章目錄 1. 寫在前面2. 接口分析3. w逆向分析4. JSON參數分析5. 距離識別6. RSA純算還原7. AES純算還原【??作者主頁】:吳秋霖 【??作者介紹】:擅長爬蟲與JS加密逆向分析!Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并致力于…

深入理解 C++ inline:三大語法特性 + 七大高頻考點全解析

一、什么是內聯函數 編譯器嘗試將 inline 函數的代碼直接插入調用處&#xff08;類似宏展開&#xff09;&#xff0c;避免函數調用的壓棧、跳轉、返回等額外開銷。適用于短小頻繁調用的函數&#xff1a;如簡單的 getter/setter、數學運算等。inline 只是 建議&#xff0c;編譯…

Flink 與 Hive 深度集成

引言 在大數據生態中&#xff0c;Flink 的流批一體化處理能力與 Hive 的數據存儲分析優勢結合&#xff0c;通過 Flink Connector for Hive 實現無縫對接&#xff0c;能顯著提升數據處理效率。本文將系統解析 Flink 與 Hive 集成的核心操作&#xff0c;涵蓋配置、讀寫、優化全流…

Axios面試常見問題詳解

axios面試常問題目及其詳解 以下是前端面試中關于 Axios 的常見問題及詳細解答&#xff0c;涵蓋核心原理、實戰場景和進階優化&#xff0c;幫助你在面試中清晰展示技術深度。 1. Axios 是什么&#xff1f;它與原生 Fetch API 有何區別&#xff1f; 回答要點&#xff1a; Axi…

14.2 《3小時從零搭建企業級LLaMA3語言助手:GitHub配置+私有化模型集成全實戰》

3小時從零搭建企業級LLaMA3語言助手&#xff1a;GitHub配置私有化模型集成全實戰 關鍵詞&#xff1a;GitHub 倉庫配置, 項目初始化, 目錄結構設計, 私有化模型集成, 開發環境標準化 Fork 并配置 GitHub 項目倉庫 本節將手把手完成 LanguageMentor 項目的倉庫克隆、環境配置和…

生物制藥自動化升級:Modbus TCP與Ethernet/IP協議轉換實踐

為優化生物制藥生產流程&#xff0c;我司計劃將現有的Allen-Bradley PLC控制系統與新型生物反應器進行集成。由于兩者采用不同的通信協議&#xff08;AB PLC使用Modbus TCP&#xff0c;而生物反應器支持Ethernet/IP&#xff09;&#xff0c;直接通信存在障礙。為此通過穩聯技術…

商業云手機核心優缺點分析

商業云手機核心優缺點分析&#xff0c;綜合技術性能、成本效率及場景適配性等多維度對比&#xff1a; 核心優勢? 成本革命? 硬件零投入?&#xff1a;免除實體手機采購&#xff08;旗艦機均價6000元&#xff09;&#xff0c;企業百臺規模可省60萬 CAPEX。 彈性計費?&…

Windows 遠程桌面添加 SSL 證書指南

Windows 遠程桌面添加 SSL 證書指南 &#x1f9fe; 準備工作&#x1f510; 第一步&#xff1a;使用 Certbot 申請 SSL 證書&#x1f4e6; 第二步&#xff1a;生成 PFX 格式證書文件&#x1f4c1; 第三步&#xff1a;導入證書到 Windows 證書管理器&#x1f512; 第四步&#xf…