Leetcode方法总结
数组/字符串⁍
区间问题⁍
数组不变,区间查询:前缀和、树状数组、线段树;
数组单点修改,区间查询:树状数组、线段树;
数组区间修改,单点查询:差分、线段树; ✔
数组区间修改,区间查询:线段树。
前缀和⁍
思路⁍
区间和 --》前缀和
定义 prefixSum 数组,prefixSum[x]:第 0 项到 第 x 项 的和。
$$prefixSum[x] = nums[0] + nums[1] +…+nums[x]$$
nums 的某项 = 两个相邻前缀和的差:
$nums[x] = prefixSum[x] - prefixSum[x - 1]$
nums 的 第 i 到 j 项 的和 ,有:
$$nums[i] +…+nums[j]=prefixSum[j] - prefixSum[i - 1]$$
例题⁍
2055. 蜡烛之间的盘子 (leetcode-cn.com)⁍
1234567891011121314151617181920212223242526272829303132333435363738394041424344class Solution: def ...
Leetcode | Python刷Leetcode注意点
想尝试拿python刷刷leetcode,随手记一点注意事项
一些不一样的写法⁍
三元表达式⁍
r = a if condition else b
True or False⁍
大写
没有自增和自减⁍
i += 1/i -= 1
最大值/最小值⁍
12max_value = float('inf') # math.infmin_value = float('-inf') # -math.inf
进制转换⁍
转10进制
1int(str, base)
转2进制
1bin(int) -> str # '0b10'
转8进制
1oct(int) -> str # '0o77'
转16进制
1hex(int) -> str # '0xff'
运算⁍
1234567891011# 除法a = 3/2 # 1.5a = int(-3/2) # -1a = math.floor(-3/2) # -2a = math.ceil(-3/2) # -1# 幂x**y ...
Electron-vue开发实战Ⅱ(二)| 实现markdown实时渲染的三种方法
项目中采用marked.js用来实现对textarea区域的markdown文本进行实时渲染。具体的实现细节以后有空更。下面总结一下,我看到的多种可以用来进行实时渲染的方案。主要途径就是electron(调用webAPI)或者vue的一些功能。
通过webAPI使用addEventListener() API⁍
之前说过,electron是结合了node.js和chromium,这意味着它可以处理DOM对象
因此,我们可以获取到相应的对象[1]
1const markdownView = document.querySelector('#markdown');
通过调用addEventListener(),检测keyup事件,即监听输入区域内是否有按完键盘的事情发生,来达到实时渲染的目的。
1234markdownView.addEventListener('keyup', (event) => { const currentContent = event.target.value; renderMarkdownToHtml( ...
Electron-vue开发实战Ⅱ(一) | PicGo代码结构分析与代码重构
PicGo代码结构分析⁍
main进程⁍
12345678910111213141516171819202122232425├─apis│ ├─app 【Provide key API interfaces for PicGo application, including uploader, window management, shortcut key system, remotes handler, etc】│ │ ├─shortKey 快捷键相关│ │ ├─system 封装createMenu/createContextMenu/createTray等内容(⭐主入口)│ │ ├─uploader 上传图片的相关内容│ │ └─window │ │ ├─contants.ts 一些常量,存放window的地址(根据是否是开发环境选择)│ │ ├─windowList.ts 用Map来声明window列表│ │ └─windowManager.ts 管理window列表│ ├─core 【The lowest level APIs ...
npm和yarn命令对照
Install dependencies
1npm install => yarn
Install a package
1npm install [package_name] => yarn add [package_name]
Install a package globally
1npm install -g [package_name] => yarn global add [package_name]
Install a package as a development dependency
1npm install --save-dev [package_name] => yarn add --dev [package_name]
Uninstall a package
1npm uninstall [package_name] => yarn remove [package_name]
Uninstall a package globally
1npm uninstall -g [package_name] => yarn global ...
面试 | Java并发编程
线程和进程⁍
进程是程序的一次执行过程,是系统运行程序的基本单位.
线程可以比作是轻量级的进程,是程序执行的最小单位,线程间的切换和调度的成本远远小于进程
启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。
线程共享进程的堆和方法区(JDK 1.8 之后的元空间),同时维护自己的程序计数器、虚拟机栈和本地方法栈
线程的生命周期和状态⁍
1234567891011121314151617181920212223242526272829303132333435363738// 方法一public class Main { public static void main(String[] args) { Thread t = new MyThread(); t.start(); // 启动新线程 }}class MyThread extends Thread { @Override public void run() ...
Leetcode|单调栈
要寻找任一个元素的 右边或者左边第一个比自己大或者小的元素的位置 ,此时我们就要想到可以用单调栈了。
时间复杂度 $O(n)$
单调栈里存放的是下标 $i$
以右边第一个比自己大的元素为例,需要维护一个从 栈顶到栈底 递增 的栈
使用单调栈主要有三个判断条件(以右边第一个比自己大的元素为例)
当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
i入栈
当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
i入栈, 因为是大于,不用记录
当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况
弹出栈顶元素st.top(),i压栈,记录 res[st.top]与i的关系
739. 每日温度⁍
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指在第 i 天之后,才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
12输入: temperatures = [73,74,75,71,69,72,76,73]输出: [1,1, ...
面试 | Java部分知识点-基础
参考:
JavaGuide[1]、《Java核心计数及面试指南》[2]
静态变量和实例变量的区别⁍
实例字段在每个实例中都有自己的一个独立“空间”,但是静态字段只有一个共享“空间”,所有实例都会共享该字段。
==> 无论修改哪个实例的静态字段,所有实例的静态字段都被修改了,原因是静态字段并不属于实例[3]
静态方法和实例方法区别⁍
调用方式
调用静态方法可以无需创建对象
静态方法: 类名.方法名/对象.方法名(不建议)
实例方法: 对象.方法名
访问类成员是否存在限制
静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),不允许访问实例成员(即实例成员变量和实例方法)
实例方法不存在这个限制。
静态方法为什么不能调用非静态成员⁍
静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接访问。而
非静态成员属于实例对象, 只有在对象实例化之后才存在, 需要通过类的实例对象去访问。
在类的非静态成员不存在的时候静态成员就已经存在了,此时调用在 内存中还不存在 的非静态成员,属于非法操作
重载(overload)和覆盖/重写(o ...
JAVA学习(十六)| 函数式编程(Lambda计算)
函数式编程(Functional Programming)就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数 没有变量 ,因此,任意一个函数, 只要输入是确定的,输出就是确定的, 这种纯函数我们称之为 没有副作用 。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
函数式编程的一个特点就是, 允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
常把函数式编程称为Lambda计算
Lambda基础⁍
FunctionalInterface⁍
我们把只定义了单方法的接口称之为FunctionalInterface,用注解@FunctionalInterface标记。
Comparator
Runnable
Callable
JAVA学习(十五)| XML与JSON | JDBC
XML与JSON⁍
XML(eXtensible Markup Language)⁍
可扩展标记语言,常通过网络作为消息传输
特点
纯文本,默认使用UTF-8编码
可嵌套,适合表示结构化数据
结构:
123456789101112<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE note SYSTEM "book.dtd"><book id="1"> <name>Java核心技术</name> <author>Cay S. Horstmann</author> <isbn lang="CN">1234567</isbn> <tags> <tag>Java</tag> <tag>Network</tag> ...