当前位置: 首页 > news >正文

算法学习-基础算法

基础算法

一.二分查找

1.模版

boolean check(int x) {
}int search(int left, int right) {while (left < right) {int mid = (left + right) >> 1;if (check(mid)) {//满足条件,向寻找范围继续寻找,例如我要找更靠左的:r = m right = mid;} else {left = mid + 1;}}return left;
}boolean check(int x) {
}int search(int left, int right) {while (left < right) {int mid = (left + right + 1) >> 1;if (check(mid)) {left = mid;} else {right = mid - 1;}}return left;
}

在这里插入图片描述

2.使用场景

2.1.普通二分查找
2.2.最小化最大值(本质是二分求最小值)
2.3.最大化最小值(本质是二分求最大值)

二.前缀和与差分数组

1.一维前缀和

class NumArray {// 前缀和数组private int[] preSum;/* 输入一个数组,构造前缀和 */public NumArray(int[] nums) {// preSum[0] = 0,便于计算累加和preSum = new int[nums.length + 1];// 计算 nums 的累加和for (int i = 1; i < preSum.length; i++) {preSum[i] = preSum[i - 1] + nums[i - 1];}}/* 查询闭区间 [left, right] 的累加和 */public int sumRange(int left, int right) {return preSum[right + 1] - preSum[left];}
}

2.二维前缀和

class NumMatrix {int[][] preSum ;public NumMatrix(int[][] matrix) {int m = matrix.length;int n = matrix[0].length;preSum = new int[m+1][n+1];for(int i = 0;i<m;i++){for(int j = 0;j<n;j++){preSum[i+1][j+1] = preSum[i+1][j] + preSum[i][j+1] - preSum[i][j] + matrix[i][j];}}}public int sumRegion(int row1, int col1, int row2, int col2) {return preSum[row2+1][col2+1] - preSum[row2+1][col1] - preSum[row1][col2+1] + preSum[row1][col1];}
}/*** Your NumMatrix object will be instantiated and called as such:* NumMatrix obj = new NumMatrix(matrix);* int param_1 = obj.sumRegion(row1,col1,row2,col2);*/

LeetCode例题

3.哈希+前缀和(子数组统计计数)

类似两数之和思路,要学会等式转换,注意设置map的下标,是否加1
LeetCode例题前缀异或和

4.一维差分数组

差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减。
在这里插入图片描述

public class Solution {public void modifyArray(int[] nums, int k) {int n = nums.length;int[] d = new int[n + 1]; // 差分数组int sumD = 0; // 累积差分值for (int i = 0; i < n; i++) {sumD += d[i];// 更新nums[i]的逻辑,根据具体问题调整nums[i] += sumD;// 根据条件更新差分数组if (需要更新条件) {int change = 计算需要的变化值;sumD -= change; // 应用变化到sumDd[i] += change; // 当前位置开始应用变化if (i + k < n) {d[i + k] -= change; // 在i+k处抵消前面的变化}}}// 可以在这里添加逻辑,根据需要处理nums数组}
}

LeetCode例题

5.二维差分数组

class Solution {public int[][] rangeAddQueries(int n, int[][] queries) {// 二维差分模板//往nn矩阵左上加一行一列,主要是为了前缀和舒服,//往nn矩阵右下加一行一列,主要是为了操作差分数组方便。int[][] diff = new int[n + 2][n + 2], ans = new int[n][n];for (int[] q : queries) {int r1 = q[0], c1 = q[1], r2 = q[2], c2 = q[3];++diff[r1 + 1][c1 + 1];--diff[r1 + 1][c2 + 2];--diff[r2 + 2][c1 + 1];++diff[r2 + 2][c2 + 2];}// 用二维前缀和复原for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)ans[i - 1][j - 1] = diff[i][j] += diff[i][j - 1] + diff[i - 1][j] - diff[i - 1][j - 1];return ans;}
}

LeetCode例题

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Visual Studio 2022 自定义字体大小
  • 摄像头设备问题如何检测
  • leetcode518:零钱兑换II
  • minio 后端大文件分片上传,合并,删除分片
  • 【线程安全】ReentrantLock和synchronized的使用示例——言简意赅
  • 【嵌入式开发之网络编程】TCP并发实现
  • 主场竞争,安踏把背影留给耐克
  • Java13 网络编程
  • 【pytorch】固定(freeze)住部分网络
  • MyBatis一级缓存和二级缓存以及 mybatis架构
  • 五指生望京新店开业,开启健康之旅
  • 用AppleScript做macOS UI自动化
  • 外卖系统开发:如何打造一个无缝衔接的用户体验?
  • 建模模型时间说明
  • GPT应用篇:如何用GPT4.0写一本言情小说?
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • javascript 总结(常用工具类的封装)
  • JDK 6和JDK 7中的substring()方法
  • Laravel 实践之路: 数据库迁移与数据填充
  • React组件设计模式(一)
  • select2 取值 遍历 设置默认值
  • Selenium实战教程系列(二)---元素定位
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 区块链技术特点之去中心化特性
  • 使用 @font-face
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 学习Vue.js的五个小例子
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​如何防止网络攻击?
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #DBA杂记1
  • #控制台大学课堂点名问题_课堂随机点名
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (function(){})()的分步解析
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (含笔试题)深度解析数据在内存中的存储
  • (七)理解angular中的module和injector,即依赖注入
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)iOS字体
  • ****Linux下Mysql的安装和配置
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET gRPC 和RESTful简单对比
  • .NET/C# 使窗口永不获得焦点
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .net和php怎么连接,php和apache之间如何连接
  • .NET中使用Redis (二)
  • .sys文件乱码_python vscode输出乱码
  • ?
  • [1181]linux两台服务器之间传输文件和文件夹
  • [Algorithm][综合训练][体育课测验(二)][合唱队形][宵暗的妖怪]详细讲解
  • [APIO2012] 派遣 dispatching
  • [autojs]autojs开关按钮的简单使用