目录

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…