算法拾遗二十七之窗口最大值或最小值的更新结构
算法拾遗二十七之窗口最大值或最小值的更新结构
- 滑动窗口
- 题目一
- 题目二
- 题目三
- 题目四
滑动窗口
第一种:R++,R右动,数会从右侧进窗口
第二种:L++,L右动,数从左侧出窗口
题目一

arr是N,窗口大小为W,会返回N-W+1个数
// 暴力的对数器方法public static int[] right(int[] arr, int w) {if (arr == null || w < 1 || arr.length < w) {return null;}int N = arr.length;int[] res = new int[N - w + 1];int index = 0;//第一个窗口0-(w-1)int L = 0;int R = w - 1;while (R < N) {int max = arr[L];for (int i = L + 1; i <= R; i++) {max = Math.max(max, arr[i]);}res[index++] = max;L++;R++;}return res;}
public static int[] getMaxWindow(int[] arr, int w) {if (arr == null || w < 1 || arr.length < w) {return null;}// qmax 双端队列就是窗口最大值的更新结构// 里面放下标方便更新LinkedList<Integer> qmax = new LinkedList<Integer>();//N-w+1int[] res = new int[arr.length - w + 1];int index = 0;//R表示窗口的右边界for (int R = 0; R < arr.length; R++) {//双端队列上最尾巴上的元素是不是小于当前的值的,如果小于等于则从尾巴弹出while (!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[R]) {qmax.pollLast();}qmax.addLast(R);//窗口的过期数的下标if (qmax.peekFirst() == R - w) {qmax.pollFirst();}//形成窗口的时候,表示需要收集答案,每一步都收集一个答案if (R >= w - 1) {res[index++] = arr[qmax.peekFirst()];}}return res;}
题目二

思路:
如果L-R已经达标了,那么L-R内部的所有子数组都是达标的,因为L-R范围内部的子数组max在变小,min在变大。
如果L-R范围不达标,那么L往左扩大范围和R往右边扩大范围都不达标。
准备一个窗口内最大值的更新结构,同样准备窗口内最小值的更新结构。【同时使用两个结构维持窗口内的最大和最小】
步骤:
1、L不动,R如果满足【L-R范围的最大值和最小值的差值如果都满足小于等于num】则R一直往右边扩
,直到不满足条件为止。(注意此时是L在0为止,算出从零开始的子数组有多少个累加进结果)
2、L向右移动一位,看看R能不能往右扩,再算从L+1位置到能构成条件的子数组有多少个,再累加进结果。
// 暴力的对数器方法public static int right(int[] arr, int sum) {if (arr == null || arr.length == 0 || sum < 0) {return 0;}int N = arr.length;int count = 0;for (int L = 0; L < N; L++) {for (int R = L; R < N; R++) {int max = arr[L];int min = arr[L];for (int i = L + 1; i <= R; i++) {max = Math.max(max, arr[i]);min = Math.min(min, arr[i]);}if (max - min <= sum) {count++;}}}return count;}public static int num(int[] arr, int sum) {if (arr == null || arr.length == 0 || sum < 0) {return 0;}int N = arr.length;int count = 0;LinkedList<Integer> maxWindow = new LinkedList<>();LinkedList<Integer> minWindow = new LinkedList<>();int R = 0;for (int L = 0; L < N; L++) {//依次尝试窗口为0开始,1开始。。。。while (R < N) {//R扩到初次不达标的时候停while (!maxWindow.isEmpty() && arr[maxWindow.peekLast()] <= arr[R]) {//维护从大到小列表maxWindow.pollLast();}maxWindow.addLast(R);while (!minWindow.isEmpty() && arr[minWindow.peekLast()] >= arr[R]) {//维护从小到大列表minWindow.pollLast();}minWindow.addLast(R);//最大值减去最小值大于sum则初次不达标了停止if (arr[maxWindow.peekFirst()] - arr[minWindow.peekFirst()] > sum) {break;} else {R++;}}//加结果count += R - L;//如果L即将过期则弹出窗口对应值if (maxWindow.peekFirst() == L) {maxWindow.pollFirst();}if (minWindow.peekFirst() == L) {minWindow.pollFirst();}}return count;}// for testpublic static int[] generateRandomArray(int maxLen, int maxValue) {int len = (int) (Math.random() * (maxLen + 1));int[] arr = new int[len];for (int i = 0; i < len; i++) {arr[i] = (int) (Math.random() * (maxValue + 1)) - (int) (Math.random() * (maxValue + 1));}return arr;}// for testpublic static void printArray(int[] arr) {if (arr != null) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}}public static void main(String[] args) {int maxLen = 100;int maxValue = 200;int testTime = 100000;System.out.println("测试开始");for (int i = 0; i < testTime; i++) {int[] arr = generateRandomArray(maxLen, maxValue);int sum = (int) (Math.random() * (maxValue + 1));int ans1 = right(arr, sum);int ans2 = num(arr, sum);if (ans1 != ans2) {System.out.println("Oops!");printArray(arr);System.out.println(sum);System.out.println(ans1);System.out.println(ans2);break;}}System.out.println("测试结束");}
题目三

给定两个数组一个是gas数组,一个是cost数组,
0号加油站有1单位的油,但是跑到加油站2需要耗费两单位的油,从哪个加油站开始能转完一圈?

如上图,只能通过从C出发才能跑完一圈
思路:
加工出一个arr数组,就是gas-cost数组,做一个简化

再看如下例子

暴力解:搞定循环数组的遍历,从0位置出发找是否有解,从1位置出发找是否有解依次找下去
方法二:
1、先算累加和:

这样写的目的:从零出发一直累加到五之前,可以判断从0位置出发不是良好出发点,再看从1位置出发依次累加

里面包含负数可以知道它不是一个良好出发点,如上图这个数组就是算从零位置开始计算的累加和得到的那个数组减去-2得到的数组。
做一个两倍长度的数组就是想让它所有原始数组中出发的那个位置,在长数组中能把它原始的累加和给加工出来
则每次计算后续的出发点的数组内容时,则减去前一个就能得到了

搞一个窗口,这个窗口就是原始数组的长度,窗口的最小值(最薄弱点)是-5减去出发位置前面一个数,从而还原出原始数组累加和最薄弱点,还原出的结果还是小于0则不是良好出发点,还原出的结果不小于0则是良好出发点
如0位置出发薄弱点为-5,还原出原始累加和为-5-0还是小于0不是良好出发点。
这道题,
要想到窗口往最大值和最小值上面靠,进而想到累加和最薄弱的点
// 测试链接:https://leetcode.com/problems/gas-station
public class GasStation {// 这个方法的时间复杂度O(N),额外空间复杂度O(N)public static int canCompleteCircuit(int[] gas, int[] cost) {boolean[] good = goodArray(gas, cost);for (int i = 0; i < gas.length; i++) {if (good[i]) {return i;}}return -1;}public static boolean[] goodArray(int[] g, int[] c) {int N = g.length;int M = N << 1;int[] arr = new int[M];for (int i = 0; i < N; i++) {arr[i] = g[i] - c[i];arr[i + N] = g[i] - c[i];}for (int i = 1; i < M; i++) {arr[i] += arr[i - 1];}LinkedList<Integer> w = new LinkedList<>();for (int i = 0; i < N; i++) {while (!w.isEmpty() && arr[w.peekLast()] >= arr[i]) {w.pollLast();}w.addLast(i);}boolean[] ans = new boolean[N];for (int offset = 0, i = 0, j = N; j < M; offset = arr[i++], j++) {if (arr[w.peekFirst()] - offset >= 0) {ans[i] = true;}if (w.peekFirst() == i) {w.pollFirst();}while (!w.isEmpty() && arr[w.peekLast()] >= arr[j]) {w.pollLast();}w.addLast(j);}return ans;}}
题目四

public class Code04_MinCoinsOnePaper {public static int minCoins(int[] arr, int aim) {return process(arr, 0, aim);}public static int process(int[] arr, int index, int rest) {if (rest < 0) {return Integer.MAX_VALUE;}if (index == arr.length) {return rest == 0 ? 0 : Integer.MAX_VALUE;} else {int p1 = process(arr, index + 1, rest);int p2 = process(arr, index + 1, rest - arr[index]);if (p2 != Integer.MAX_VALUE) {p2++;}return Math.min(p1, p2);}}// dp1时间复杂度为:O(arr长度 * aim)public static int dp1(int[] arr, int aim) {if (aim == 0) {return 0;}int N = arr.length;int[][] dp = new int[N + 1][aim + 1];dp[N][0] = 0;for (int j = 1; j <= aim; j++) {dp[N][j] = Integer.MAX_VALUE;}for (int index = N - 1; index >= 0; index--) {for (int rest = 0; rest <= aim; rest++) {int p1 = dp[index + 1][rest];int p2 = rest - arr[index] >= 0 ? dp[index + 1][rest - arr[index]] : Integer.MAX_VALUE;if (p2 != Integer.MAX_VALUE) {p2++;}dp[index][rest] = Math.min(p1, p2);}}return dp[0][aim];}public static class Info {public int[] coins;public int[] zhangs;public Info(int[] c, int[] z) {coins = c;zhangs = z;}}public static Info getInfo(int[] arr) {HashMap<Integer, Integer> counts = new HashMap<>();for (int value : arr) {if (!counts.containsKey(value)) {counts.put(value, 1);} else {counts.put(value, counts.get(value) + 1);}}int N = counts.size();int[] coins = new int[N];int[] zhangs = new int[N];int index = 0;for (Entry<Integer, Integer> entry : counts.entrySet()) {coins[index] = entry.getKey();zhangs[index++] = entry.getValue();}return new Info(coins, zhangs);}// dp2时间复杂度为:O(arr长度) + O(货币种数 * aim * 每种货币的平均张数)public static int dp2(int[] arr, int aim) {if (aim == 0) {return 0;}// 得到info时间复杂度O(arr长度)Info info = getInfo(arr);int[] coins = info.coins;int[] zhangs = info.zhangs;int N = coins.length;int[][] dp = new int[N + 1][aim + 1];dp[N][0] = 0;for (int j = 1; j <= aim; j++) {dp[N][j] = Integer.MAX_VALUE;}// 这三层for循环,时间复杂度为O(货币种数 * aim * 每种货币的平均张数)for (int index = N - 1; index >= 0; index--) {for (int rest = 0; rest <= aim; rest++) {dp[index][rest] = dp[index + 1][rest];for (int zhang = 1; zhang * coins[index] <= aim && zhang <= zhangs[index]; zhang++) {if (rest - zhang * coins[index] >= 0&& dp[index + 1][rest - zhang * coins[index]] != Integer.MAX_VALUE) {dp[index][rest] = Math.min(dp[index][rest], zhang + dp[index + 1][rest - zhang * coins[index]]);}}}}return dp[0][aim];}// dp3时间复杂度为:O(arr长度) + O(货币种数 * aim)// 优化需要用到窗口内最小值的更新结构public static int dp3(int[] arr, int aim) {if (aim == 0) {return 0;}// 得到info时间复杂度O(arr长度)Info info = getInfo(arr);int[] c = info.coins;int[] z = info.zhangs;int N = c.length;int[][] dp = new int[N + 1][aim + 1];dp[N][0] = 0;for (int j = 1; j <= aim; j++) {dp[N][j] = Integer.MAX_VALUE;}// 虽然是嵌套了很多循环,但是时间复杂度为O(货币种数 * aim)// 因为用了窗口内最小值的更新结构for (int i = N - 1; i >= 0; i--) {for (int mod = 0; mod < Math.min(aim + 1, c[i]); mod++) {// 当前面值 X// mod mod + x mod + 2*x mod + 3 * xLinkedList<Integer> w = new LinkedList<>();w.add(mod);dp[i][mod] = dp[i + 1][mod];for (int r = mod + c[i]; r <= aim; r += c[i]) {while (!w.isEmpty() && (dp[i + 1][w.peekLast()] == Integer.MAX_VALUE|| dp[i + 1][w.peekLast()] + compensate(w.peekLast(), r, c[i]) >= dp[i + 1][r])) {w.pollLast();}w.addLast(r);int overdue = r - c[i] * (z[i] + 1);if (w.peekFirst() == overdue) {w.pollFirst();}dp[i][r] = dp[i + 1][w.peekFirst()] + compensate(w.peekFirst(), r, c[i]);}}}return dp[0][aim];}public static int compensate(int pre, int cur, int coin) {return (cur - pre) / coin;}// 为了测试public static int[] randomArray(int N, int maxValue) {int[] arr = new int[N];for (int i = 0; i < N; i++) {arr[i] = (int) (Math.random() * maxValue) + 1;}return arr;}// 为了测试public static void printArray(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}// 为了测试public static void main(String[] args) {int maxLen = 20;int maxValue = 30;int testTime = 300000;System.out.println("功能测试开始");for (int i = 0; i < testTime; i++) {int N = (int) (Math.random() * maxLen);int[] arr = randomArray(N, maxValue);int aim = (int) (Math.random() * maxValue);int ans1 = minCoins(arr, aim);int ans2 = dp1(arr, aim);int ans3 = dp2(arr, aim);int ans4 = dp3(arr, aim);if (ans1 != ans2 || ans3 != ans4 || ans1 != ans3) {System.out.println("Oops!");printArray(arr);System.out.println(aim);System.out.println(ans1);System.out.println(ans2);System.out.println(ans3);System.out.println(ans4);break;}}System.out.println("功能测试结束");System.out.println("==========");int aim = 0;int[] arr = null;long start;long end;int ans2;int ans3;System.out.println("性能测试开始");maxLen = 30000;maxValue = 20;aim = 60000;arr = randomArray(maxLen, maxValue);start = System.currentTimeMillis();ans2 = dp2(arr, aim);end = System.currentTimeMillis();System.out.println("dp2答案 : " + ans2 + ", dp2运行时间 : " + (end - start) + " ms");start = System.currentTimeMillis();ans3 = dp3(arr, aim);end = System.currentTimeMillis();System.out.println("dp3答案 : " + ans3 + ", dp3运行时间 : " + (end - start) + " ms");System.out.println("性能测试结束");System.out.println("===========");System.out.println("货币大量重复出现情况下,");System.out.println("大数据量测试dp3开始");maxLen = 20000000;aim = 10000;maxValue = 10000;arr = randomArray(maxLen, maxValue);start = System.currentTimeMillis();ans3 = dp3(arr, aim);end = System.currentTimeMillis();System.out.println("dp3运行时间 : " + (end - start) + " ms");System.out.println("大数据量测试dp3结束");System.out.println("===========");System.out.println("当货币很少出现重复,dp2比dp3有常数时间优势");System.out.println("当货币大量出现重复,dp3时间复杂度明显优于dp2");System.out.println("dp3的优化用到了窗口内最小值的更新结构");}}相关文章:
算法拾遗二十七之窗口最大值或最小值的更新结构
算法拾遗二十七之窗口最大值或最小值的更新结构滑动窗口题目一题目二题目三题目四滑动窗口 第一种:R,R右动,数会从右侧进窗口 第二种:L,L右动,数从左侧出窗口 题目一 arr是N,窗口大小为W&…...
【带你搞定第二、三、四层交换机】
01 第二层交换机 OSI参考模型的第二层叫做数据链路层,第二层交换机通过链路层中的MAC地址实现不同端口间的数据交换。 第二层交换机主要功能,就包括物理编址、错误校验、帧序列以及数据流控制。 因为这是最基本的交换技术产品,目前桌面…...
C++基础了解-22-C++ 重载运算符和重载函数
C 重载运算符和重载函数 一、C 重载运算符和重载函数 C 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义…...
BatchNormalization
目录 Covariate Shift Internal Covariate Shift BatchNormalization Q1:BN的原理 Q2:BN的作用 Q3:BN的缺陷 Q4:BN的均值、方差的计算维度 Q5:BN在训练和测试时有什么区别 Q6:BN的代码实现 Covariate Shift 机器学习中&a…...
vue 中安装插件实现 rem 适配
vue 中实现 rem 适配vue 项目实现页面自适应,可以安装插件实现。 postcss-pxtorem 是 PostCSS 的插件,用于将像素单元生成 rem 单位。 autoprefixer 浏览器前缀处理插件。 amfe-flexible 可伸缩布局方案替代了原先的 lib-flexible 选用了当前众多浏览…...
Hadoop学习
1.分布式与集群 hosts文件: 域名映射文件 2.Linux常用命令 ls -a:查看当前目录下所有文件mkdir -p:如果没有对应的父文件夹,会自动创建rm -rf:-f:强制删除 -r:递归删除cp -r:复制文…...
Golang反射源码分析
在go的源码包及一些开源组件中,经常可以看到reflect反射包的使用,本文就与大家一起探讨go反射机制的原理、学习其实现源码 首先,了解一下反射的定义: 反射是指计算机程序能够在运行时,能够描述其自身状态或行为、调整…...
Qt之悬浮球菜单
一、概述 最近想做一个炫酷的悬浮式菜单,考虑到菜单展开和美观,所以考虑学习下Qt的动画系统和状态机内容,打开QtCreator的示例教程浏览了下,大致发现教程中2D Painting程序和Animated Tiles程序有所帮助,如下图所示&a…...
易优cms attribute 栏目属性列表
attribute 栏目属性列表 attribute 栏目属性列表 [基础用法] 标签:attribute 描述:获取栏目的属性列表,或者单独获取某个属性值。 用法: {eyou:attribute typeauto} {$attr.name}:{$attr.value} {/eyou:attri…...
表格中的table-layout属性讲解
表格中的table-layout属性讲解 定义和用法 tableLayout 属性用来显示表格单元格、行、列的算法规则。 table-layout有三个属性值:auto、fixed、inherit。 fixed:固定表格布局 固定表格布局与自动表格布局相比,允许浏览器更快地对表格进行布…...
【MFA】windows环境下,使用Montreal-Forced-Aligner训练并对齐音频
文章目录一、安装MFA1.安装anaconda2.创建并进入虚拟环境3.安装pyTorch二、训练新的声学模型1.确保数据集的格式正确2.训练声音模型-导出模型和对齐文件3.报错处理1.遇到类似: Command ‘[‘createdb’,–host‘ ’, ‘Librispeech’]’ returned non-zero exit sta…...
C语言实验小项目实例源码大全订票信息管理系统贪吃蛇图书商品管理网络通信等
wx供重浩:创享日记 对话框发送:c项目 获取完整源码源文件视频讲解环境资源包文档说明等 包括火车订票系统、学生个人消费管理系统、超级万年历、学生信息管理系统、网络通信编程、商品管理系统、通讯录管理系统、企业员工管理系统、贪吃蛇游戏、图书管理…...
电脑图片损坏是怎么回事
电脑图片损坏是怎么回事?对于经常使用电脑的我们,总是会下载各种各样的图片,用于平时的使用中。但难免会遇到莫名其妙就损坏的图片文件,一旦发生这种情况,要如何才能修复损坏的图片呢?下面小编为大家带来常用的修复方…...
【论文研读】无人机飞行模拟仿真平台设计
无人机飞行模拟仿真平台设计 摘要: 为提高飞行控制算法的研发效率,降低研发成本,基于数字孪生技术设计一个无人机硬件在环飞行模拟仿真平台。从几何、物理和行为3个方面研究无人机数字模型构建方法,将物理实体以数字化方式呈现。设计一种多元融合场景建模法,依据属…...
【算法题】2379. 得到 K 个黑块的最少涂色次数
插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 题目: 给你一个长度为 n 下标从 0 开始的…...
DJ1-3 计算机网络和因特网
目录 一、物理介质 1. 双绞线 2. 同轴电缆 3. 光纤线缆 4. 无线电磁波 二、端系统上的 Internet 服务 1. 面向连接的服务 TCP(Transmission Control Protocol) 2. 无连接的服务 UDP(User Datagram Protocol) TCP 和 UD…...
Git学习笔记(六)-标签管理
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签…...
Semaphore 源码解读
一、Semaphore Semaphore 通过设置一个固定数值的信号量,并发时线程通过 acquire() 获取一个信号量,如果能成功获得则可以继续执行,否则将阻塞等待,当某个线程使用 release() 释放一个信号量时,被阻塞的线程则可以被唤…...
RZ/G2L工业核心板U盘读写速率测试
1. 测试对象HD-G2L-IOT基于HD-G2L-CORE工业级核心板设计,双路千兆网口、双路CAN-bus、2路RS-232、2路RS-485、DSI、LCD、4G/5G、WiFi、CSI摄像头接口等,接口丰富,适用于工业现场应用需求,亦方便用户评估核心板及CPU的性能。HD-G2L…...
《SQL与数据库基础》18. MySQL管理
SQL - MySQL管理MySQL管理系统数据库常用工具mysqlmysqladminmysqlbinlogmysqlshowmysqldumpmysqlimportsource本文以 MySQL 为例 MySQL管理 系统数据库 Mysql数据库安装完成后,自带了以下四个数据库,具体作用如下: 数据库含义mysql存储My…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
