LeetCode 方法整理(部分更新中)

news2024/9/19 10:42:16

1、迭代,链表反转

listNode prev = null, next, curr = head;
while (curr != null) {
	next = curr.next;
    curr.next = prev;
    curr = next;
    prev = curr;
    curr = next;
}
return prev;

2、递归,链表反转

/*// 两个节点时
head.next.next = head;
head.next = null;
*/

// 多个节点时
listNode recursion(listNode head) {
	if (head == null || head.next == null) {
        return head;
    }
    listNode new_head = recursion(head.next);
    head.next.next = head;
	head.next = null;
    return new_head;
}

3、统计素数的个数,埃筛法

// 暴力算法
// 遍历 [2, n),判断每一个书是否为素数
// x 素数判断,查找 [2, x),是否有能够整除 x 的数

// 埃筛法
// 遍历到一个素数,对素数进行倍增,倍增的结果是合数,遍历的时候,这些合数直接跳过
vector<bool> isPrime(n, 0);
int cnt = 0;
for (int i = 2; i < n; i++) {
    if (!isPrime[i]) {
        cnt ++;
        for (int j = 2 * i; j < n; j += i) {
        // 这里可以优化,去掉重复遍历
        // for (int j = i * i; j < n; j += i)
            isPrime[j] = 1;
        }
    }
}
return cnt;

4、删除排序数组中的重复项,双指针

// 快慢指针
// 不相等,一起往后移动
// 相等,快指针移动,慢指针不移动
if (!nums.size()) {
    return 0;
}
int i = 0;
for (unsigned j = 1; j < nums.szie(); j++) {
    if (nums[j] != nums[i]) {
        i++;
        nums[i] = nums[j];
    }
}
return i + 1;

5、二分法

// 暴力遍历是万能的,也可以使用二分法

6、牛顿迭代

// n = x * x
// (n / x + x) / 2 = placeholder
// (n / placeholder + placeholder) / 2

7、动态规划

// dp 数组,迭代
// 递归
// 双指针减小空间复杂度
// 首尾相连:第一个和最后一个二选一,在[0, n-2] 和 [1, n - 1],分别求最大值,再取二者最大值
// 二叉树结构,深度优先遍历,递归

8、寻找数组的中心下标

// 左边元素的和等于右边的元素的和
// 数组求和,sum 整个数组的求和
// total,累加元素
// 从左往右遍历数组, sum 递减,和当前的 total 比较,当二者相等时,即为所求位置

9、数组中三个数的最大乘积

// 先对数组排序
// 最小的两个元素和最大的一个元素的乘积,最大的三个元素的乘积,两者的较大者就是结果
// 原因是如果有负数,那么最小的数一定是负数,如果有正数,那么最大的数一定是正数

// 线性扫描
// 在数组中找到最大的三个值和最小的两个值即可
// 找最小的两个
int min1 = INT_MAX, min2 = INT_MAX;
int max1 = INT_MIN, max2 = INT_MAX, max3 = INT_MAX;
for(auto x : nums) {
    if (x < min1) {
        min2 = min1;
        min1 = x;
    } else if (x < min2) {
        min2 = x;
    }
    if (x > max1) {
        max3 = max2;
        max2 = max1;
        max1 = x;
    } else if (x > max2) {
        max3 = max2;
        max2 = x;
    } else if (x > max3) {
        max3 = x;
    }
}

10、两数之和

// 无序数组
// 暴力遍历
// 另一种方法,map 打标记

// 有序数组
// 二分查找,遍历数组,在该元素 x 开始的后面的子数组使用二分法来查找 target - x,直到找到 满足条件的 x 为止
// 双指针,分别从数组开头和结尾开始,根据两者相加与 target 的关系:若大于,右指针左移;小于,左指针右移。直到两指针相等,或者找到结果,停止

两数之和

11、斐波那契数列

// 暴力解法,计算到第 N 位为止
// 递归

// 暴力解法,去重递归
// 每一个节点的值都存储起来,减少重复运算

// 双指针迭代,只需要保存两个值即可
if (!num) {
    return 0;
}
if (num == 1){
    return 1;
}
int low = 0, high = 1;
for (int i = 2; i < num; i++) {
    int sum = low + high;
    low = high;
    high = sum;
}
return high;

递归:

递归

去重递归:

去重递归

12、排列硬币

// 直接用 N 从 1 开始减,直到 i > n

// 二分,假设可以放 N 行,在 [0,n] 中间二分查找 x,直到 (x*x+x) / 2 

// 牛顿迭代

13、合并两个有序数组

// 数组合并,再排序

// 同时遍历两个数组,按顺序合并进一个新数组

// 同时倒序遍历两个数组,从 nums1 的尾部开始放置

14、环形链表

// 判断链表中是否存在环
// 使用 set,来存放每一个访问到的节点,若出现重复的节点,那么就存在环
std::set<ListNode> hashSet();

// 快慢指针法
// 若存在环,两个指针会相遇
if (head == null || head.next == null)
    return false;
ListNode slow = head;
ListNode quick = head.next;
while(slow != quick) {
    if (quick == null || quick.next == null)
        return false;
    slow = slow.next;
    quick = quick.next.next;
}
return ture;

15、子数组最大平均数,滑动窗口

// 双指针,滑动窗口
int max_sum = INT_MIN;
int start = 0, end = k - 1;
int sum = 0;
for (int 1 = 0; i < k; i++) {        
   sum += nums[i];
}
start++;
end++;
for ( ; end < nums.size(); start++, end++) {
   max_sum = max_sum + nums[end] - nums[start];
   if (max_sum < sum)
       max_sum = sum;
}
return max_sum * 1.0 / k;

16、在 1000 瓶药中找出毒药

// 利用二进制表示来做,还有多个变种问题

17、二叉树最小深度,深度优先/广度优先

// 深度优先,先找到每一个叶子结点,进入叶子节点的深度,再从叶子结点往上遍历,直到根节点,求出每一个节点的深度,求出深度的最小值
int minDepth(TreeNode root) {
if (root == null) {
    return 0;
}
// 递归
if (root.left == null || root.right == null) 
    return 1;
int min = INT_MAX;
if (root.left != null) {
    min = max(minDepth(root.left),min);
}
if (root.right != null)
    min = max(minDepth(root.right), min);
return min + 1}


// 广度优先,根节点开始向下找,逐层找,找到叶子结点为止
// 广度优先,使用队列存放节点,先进先出
int minDepth(TreeNode root) {
    if (root == null)
        return 0;
    std::queue<TreeNode> q;
    root.depth = 1;
    q.push(root);
    while(!q.empty()){
        TreeNode currNode = queue.front();
        q.pop();
        if (currNode.left == null || currNode.right == null)
            return currNode.depth;
        if (currNode.left != null) {
            currNode.left.depth = currNode.depth + 1;
            q.push(currNode.left);
        }
        if (currNode.right != null) {
            currNode.right.depth = currNode.depth + 1;
            q.push(currNode.right);
        }
    }
    return 0;
}

18、最长连续递增子序列,贪心法

// 数组未排序,子序列下标连续
int findLength(std::vector<int> nums) {
    int start = 0;
    int maxLength = 0;
    for (int i = 1; i < nums.size(); i++) {
        if (nums[i] <= nums[i - 1]) {
            start = i;
        }
        maxLength = max(i - start + 1, maxLength); 
    }
    return maxLength;
}

19、柠檬水找零,贪心法

// 5 块不用找零,10块只能找5 块,20 优先找 10 + 5
bool change(std::vector<int> bills){
    int five = 0, ten = 0;
    for (int i = 0; i < bills.size(); i++) {
        if (bills[i] == 5) {
            five++;
        } else if (bills[i] == 10) {
            if (five == 0)
                return false;
            five--;
            ten++} else {
            if (five > 0 && ten > 0) {
                five--;
                ten--;
            } else if (five >= 3) {
                five -= 3;
            } else {
                return false;
            }
        }
    }
    return true;
}

20、求三角形最大周长,贪心法

// 组成三角形:三边关系
// 数组排序,找最大的三个数,判断能否组成三角形,若不行,则往前滑动一个元素,直到符合三角形三边关系即可
// 在数组排序之后,取元素的时候,从后往前取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/729966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苹果手机怎么设置日程安排提醒闹钟?简单几步

在忙碌的工作和生活中&#xff0c;我们经常会忘记重要的约会、会议和任务。这时候&#xff0c;一个可靠的日程提醒闹钟就显得尤为重要了。通过在手机上设置日程安排提醒闹钟&#xff0c;让我们不再错过任何重要的事情。 那么苹果手机怎么设置日程安排提醒闹钟&#xff1f; 敬…

硬件电路设计--运算放大器(一)参数和分类

文章目录 前言一、运放分类1.1 功能分类1.2 按单颗IC封装1.3 第一脚的判断 二、运放参数2.1 理想运放2.2 实际运放2.3 数据手册中的重要参数2.3.1 供电电压Vs&#xff08;power supply&#xff09;2.3.2 虚短虚断2.3.3 输入偏置电流Ib2.3.4 噪声Vn2.3.5 静态电流IQ2.3.6 输入失…

用户端Web测试方法与技术

目录&#xff1a; WEB 测试概念WEB 测试的价值WEB 测试学习路线WEB 基础知识html讲解javascript讲解css讲解web项目测试流程web测试设计思路web端常见bug解析Litemall购物车功能测试用例设计浏览器开发者工具web兼容测试策略Litemall购物车功能测试执行 1.WEB 测试概念 WEB…

【InnoDB 存储引擎】5.4.5 The Slow Query Log(慢日志实验)

文章目录 1 慢日志实验环境准备2 开始实验2.1 实验 1&#xff1a;超过查询时间相关慢日志并观察2.2 实验 2&#xff1a;不使用索引相关慢日志并观察2.3 实验 3&#xff1a;打印额外的慢日志信息2.4 实验 4&#xff1a;使用 mysqldumpslow 工具分析日志文件2.5 实验 5&#xff1…

《UNUX环境高级编程》(7)进程环境

1、引言 2、main函数 main函数的原型/*argc是命令行参数的数目&#xff0c;argv是指向各个指针所构成的数组*/ int main(int argc,char *argv[]);3、进程终止 有八种方式使进程终止。其中5种是正常&#xff0c;它们是&#xff1a; 从main函数返回调用exit调用_exit或_Exit最后…

看一看LRU与LFU

LRU&#xff08;Least recently used&#xff1a;最近最少使用&#xff09;和LFU&#xff08;Least frequently used&#xff1a;最不经常使用&#xff09;&#xff0c;两个都是以链表结构为基础&#xff0c;一般是作为缓存使用&#xff0c;当然&#xff0c;既然是缓存&#xf…

第六章:L2JMobius学习 – 源码讲解网络数据通信

本章节介绍客户端和服务器端的网络数据通信&#xff0c;使用的技术是Java NIO&#xff08;也就是套接字Socket&#xff09;。服务器端和客户端使用Socket通信的原因在于&#xff0c;它是双向的&#xff0c;持久的。也就是说&#xff0c;服务器端可以随时的向客户端发送数据&…

Tomcat7部署war包getshell 漏洞复现

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 验证方式03 利用方式04 修复方案 01 漏洞描述 Tomcat支持在后台部署war文件&#xff0c;可以直接将webshell部署到web目录下。其中&#xff0c;欲访问后台&#xff0c;需要对应用户有相…

pycharm如何给一串中文快捷加引号(方法一)

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 门前冷落鞍马稀&#xff0c;老大嫁作商人妇。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python白银群【此类生物】问了一个Pycharm基础的问题&a…

Linux文件管理常用命令补充

&#xff08;该图由AI绘制 关注我 学习AI画图&#xff09; 目录 一、查看文件内容 more分屏显示文件内容&#xff08;了解&#xff09; less分屏显示文件内容&#xff08;重点&#xff09; 二、文件统计命令 1、wc命令 2、du命令 三、文件处理命令 1、find命令 2、gr…

unity相机视角平移一段距离

using System.Collections; using System.Collections.Generic; using UnityEngine;public class ControlCamera : MonoBehaviour {//相机视角焦点平移一段距离//需求 相机视角 内的3D对象A 在视角内平移到屏幕C点 public Vector3 InitCameraPos;// Start is called be…

代码随想录算法训练营第十一天 | 二叉树系列2

二叉树系列2 101 对称二叉树二叉树很重要的一点&#xff1a;确定遍历顺序关于递归代码随想录的代码我的代码(理解后编写) 100 相同的树我的代码 572 另一个树的子树我的代码录友的代码&#xff0c;只用递归&#xff01;&#xff01;&#xff01; 104 二叉树的最大深度重点代码随…

OA办公自动化系统哪个好?办公系统oa排名及对比

一、什么是OA办公自动化系统 OA&#xff08;Office Automation办公自动化&#xff09;是一种将智能化科技应用于企业管理中的应用系统。它可以通过电脑网络、互联网等技术手段&#xff0c;将企业的各种业务流程、各种业务数据进行集成和处理&#xff0c;将各种业务流程和各种业…

winfrom 利用反射 加载窗体(单例)

①新建一个项目, 程序集名称为: AssemblyForm (下面要用到的) ②新建一个Form窗体,窗体名称为: Form1 (下面也要用到), Form1里的代码: using System; using System.Windows.Forms;namespace AssemblyForm {public partial class Form1 : Form{public Form1(){InitializeCo…

web-html的基本用法

web前端代码基本用法 <html> <head><meta charset"utf-8"><!-- charset 属性规定 HTML 文档的字符编码。要是没有规定字符编码的话是有可能乱码的 -->待到秋来九月八&#xff08;head&#xff09;<!-- 头部就是直接写在最上面的文字&…

Css:高级技巧

1.精灵图使用 用ps的切片功能测量图片大小和位置 2.字体图标 3.CSS三角形 4.元素显示隐藏 5.鼠标样式 6.输入框input 轮廓线 7.防止文本域拖拽 8 vertical-align实现行内块和文字垂直居中对齐 9.单行文字溢出省略号显示 10.多行文字溢出省略号显示 11.布局技巧 1.相对定位会压…

实战|如何在Linux 系统上免费托管网站

动动发财的小手&#xff0c;点个赞吧&#xff01; Web 服务器可用于指代硬件和软件&#xff0c;或者两者一起工作。出于本指南的目的&#xff0c;我们将重点关注软件方面&#xff0c;并了解如何在 Linux 机器上托管网站。 Web 服务器是一种通过 HTTP/HTTPS 协议接收并响应客户端…

【算法集训之线性表篇】Day 03

文章目录 题目一思路分析代码实现效果 题目一 从有序顺序表中删除其值在给定值s和t之间(要求s<t)的所有元素&#xff0c;若s或t不合理或者线性表为空&#xff0c;则显示错误信息并退出运行。 思路分析 首先&#xff0c;题目给出数据结构为有序顺序表&#xff0c;故要查找…

B站创建视频分集播放列表

上传视频在B站上创建视频分集列表方法 上传时创建分集列表 1、打开B站 2、登录B站后&#xff0c;点击投稿上传视频。 3、上传视频或把视频直接拖拽到页面里&#xff1b; 4、点击上传第一个视频后页面下会出现一个号的按钮&#xff0c;点击继续上传 &#xff0c;上传视频就…

【Python】Selenium操作cookie实现免登录

文章目录 一、查看浏览器cookie二、获取cookie基本操作三、获取cookie并实现免登录四、封装成函数 一、查看浏览器cookie cookie、session、token的区别&#xff1a; cookie存储在浏览器本地客户端&#xff0c;发送的请求携带cookie时可以实现登录操作。session存放在服务器。…