【贪心算法】贪心算法30题

一、贪心算法简介

在这里插入图片描述

证明贪心策略正确性的常用方法:直接证明、交换论证法、反证法、分类讨论…


二、相关编程题

2.1 柠檬水找零

题目链接

860. 柠檬水找零 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

提示:最优解和贪心解唯一可能不同的就是20块钱的找零方法,贪心解由优先选择10+5,最优解可能是5+5+5。最优解中可能没有用到10块找零,也可能在后面找零时用到了,但都可以和5+5交换也转换成10+5。这样在不破坏最优性质的前提下就可以转化为贪心解。

编写代码

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int f = 0, t = 0;
        for(auto e : bills)
        {
            if(e == 5) ++f;
            else if(e == 10)
            {
                if(f>0) ++t, --f;
                else return false;
            } 
            else
            {
                if(t>0 && f>0) --t, --f;
                else if(f>2) f-=3;
                else return false;
            }
        }
        return true;
    }
};

2.2 将数组和减半的最少操作次数

题目链接

2208. 将数组和减半的最少操作次数 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int halveArray(vector<int>& nums) {
        priority_queue<double> heap;
        double sum = 0;
        for(auto e : nums)
        {
            heap.push(e);
            sum+=e;
        }
        int cnt = 0;
        double aim = sum/2;
        while(sum > aim)
        {
            double top = heap.top()/2;
            heap.pop();
            sum-=top;
            heap.push(top);
            ++cnt;
        }
        return cnt;
    }
};

2.3 最大数

题目链接

179. 最大数 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    string largestNumber(vector<int>& nums) {
        vector<string> strs;
        for(auto e : nums) 
            strs.push_back(to_string(e));
        sort(strs.begin(), strs.end(), [](const string& a, const string& b)
        {
            return a+b > b+a;
        });
        string ret;
        for(auto e : strs) ret += e;
        if(ret[0] == '0') return "0";
        return ret;
    }
};

2.4 摆动序列

题目链接

376. 摆动序列 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

提示:这里使用的是反证法证明的

编写代码

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        int n = nums.size();
        if(n < 2) return n;
        int left = 0, right = 0;
        int ret = 0;
        for(int i = 0; i < n-1; ++i)
        {
            right = nums[i+1]-nums[i];
            if(right == 0) continue; //right跳过中间连续相等的区间
            if(left*right <= 0) ++ret; //等于0是为了选第1个位置
            left = right;
        }
        return ret+1; //最后1个位置是一定要选的
    }
};

2.5 最长递增子序列

题目链接

300. 最长递增子序列 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        vector<int> arr;
        arr.push_back(nums[0]);
        for(auto e : nums)
        {
            if(e > arr.back()) 
                arr.push_back(e);
            else
            {
                int left = 0, right = arr.size();
                while(left < right)
                {
                    int mid = left+(right-left)/2;
                    if(arr[mid] < e) left = mid+1;
                    else if(arr[mid] >= e) right = mid;
                }
                arr[left] = e;
            }
        }
        return arr.size();
    }
};

2.6 递增的三元子序列

题目链接

334. 递增的三元子序列 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        int a = nums[0], b = INT_MAX;
        for(int i = 1; i < nums.size(); ++i)
        {
            if(nums[i] > b) return true;
            else if(nums[i] <= a) a = nums[i];
            else b = nums[i];
        }
        return false;
    }
};

2.7 最长连续递增序列

题目链接

674. 最长连续递增序列 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

编写代码

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        int ret = 0;
        int i = 0, j = 1;
        for(; j < nums.size(); ++j)
        {
            if(nums[j] <= nums[j-1]) 
            {
                ret = max(ret, j-i);
                i = j;
            }
        }
        ret = max(ret, j-i); //记得算上最后一个子数组
        return ret;
    }
};

2.8 买卖股票的最佳时机

题目链接

121. 买卖股票的最佳时机 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int ret = 0, prevmin = prices[0];
        for(int i = 1; i < prices.size(); ++i)
        {
            ret = max(ret, prices[i]-prevmin);
            prevmin = min(prevmin, prices[i]);
        }
        return ret;
    }
};

2.9 买卖股票的最佳时机Ⅱ

题目链接

122. 买卖股票的最佳时机 II - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

//解法一:双指针
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int ret = 0;
        int i = 0, j = 1;
        for(; j < prices.size(); ++j)
        {
            if(prices[j] <= prices[j-1]) //找到上升末端的下一个位置j
            {
                ret += prices[j-1]-prices[i];
                i = j;
            }
        }
        ret += prices[j-1]-prices[i];
        return ret;
    }
};

//解法二:将交易拆分成一天一天
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int ret = 0;
        for(int i = 1; i < prices.size(); ++i)
        {
            int tmp = prices[i]-prices[i-1];
            if(tmp > 0) ret+=tmp;
        }
        return ret;
    }
};

2.10 k次取反后最大化的数组和

题目链接

1005. K 次取反后最大化的数组和 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

每次将数组中最小的数变为相反数即可,也可以优化一下,如果数组中最小的数是正数且此时的变换次数是偶数可以直接忽略跳过。

编写代码

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        priority_queue<int, vector<int>, greater<int>> heap; //用小根堆选出最小的数
        int sum = 0;
        for(auto e : nums)
        {
            heap.push(e);
            sum += e;
        }
        while(k--)
        {
            int top = heap.top();
            if(top>=0 && (k+1)%2==0) break;
            heap.pop();
            heap.push(-top);
            sum-=top*2;
        }
        return sum;
    }
};

2.11 按身高排序

题目链接

2418. 按身高排序 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    vector<string> sortPeople(vector<string>& names, vector<int>& heights) {
        int n = names.size();
        vector<int> index(n);
        for(int i = 0; i < n; ++i) 
            index[i] = i;
        sort(index.begin(), index.end(), [&](int a, int b){
            return heights[a] > heights[b];
        });

        vector<string> ret;
        for(auto i : index)
        {
            ret.push_back(names[i]);
        }
        return ret;
    }
};

2.12 优势洗牌

题目链接

870. 优势洗牌 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size();
        vector<int> index(n);
        for(int i = 0; i < n; ++i)
            index[i] = i;
        sort(nums1.begin(), nums1.end());
        sort(index.begin(), index.end(), [&](int a, int b){
            return nums2[a] < nums2[b];
        });

        vector<int> ret(n);
        int l = 0, r = n-1;
        for(auto e : nums1)
        {
            if(e <= nums2[index[l]]) //比不过
                ret[index[r--]] = e;
            else //比得过
                ret[index[l++]] = e;
        }
        return ret;
    }
};

2.13 最长回文串

题目链接

409. 最长回文串 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int longestPalindrome(string s) {
        //计数
        int hash[127] = {0};
        for(auto ch : s)
            hash[ch]++;
        //统计结果
        int ret = 0;
        for(auto e : hash)
        {
            ret += e/2*2; //整数除法向下取整
        }
        return ret==s.size()? ret:ret+1;
    }
};

2.14 增减字符串匹配

题目链接

942. 增减字符串匹配 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理
在这里插入图片描述

编写代码

class Solution {
public:
    vector<int> diStringMatch(string s) {
        int l = 0, r = s.size();
        vector<int> ret;
        for(int i = 0; i < s.size(); ++i)
        {
            if(s[i] == 'I') ret.push_back(l++);
            else ret.push_back(r--);
        }
        ret.push_back(l);
        return ret;
    }
};

2.15 分发饼干

题目链接

455. 分发饼干 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(), g.end());
        sort(s.begin(), s.end());
        int ret = 0;
        for(int i = 0, j = 0; i<g.size() && j<s.size();)
        {
            if(s[j] >= g[i]) ++ret, ++i, ++j;
            else ++j;
        }
        return ret;
    }
};

2.16 最优除法

题目链接

553. 最优除法 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    string optimalDivision(vector<int>& nums) {
        int n = nums.size();
        if(n == 1) return to_string(nums[0]);
        if(n == 2) return to_string(nums[0])+"/"+to_string(nums[1]);
        string ret;
        ret += to_string(nums[0])+"/("+to_string(nums[1]);
        for(int i = 2; i < n; ++i)
        {
            ret+="/"+to_string(nums[i]);
        }
        ret+=")";
        return ret;
    }
};

2.17 跳跃游戏Ⅱ

题目链接

45. 跳跃游戏 II - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

//解法一:动态规划
class Solution {
public:
    int jump(vector<int>& nums) {
        int n = nums.size();
        vector<int> dp(n, INT_MAX);
        dp[0] = 0;
        for(int i = 1; i < n; ++i)
        {
            for(int j = 0; j < i; ++j)
            {
                if(j+nums[j] >= i)
                    dp[i] = min(dp[i], dp[j]+1);
            }
        }
        return dp[n-1];
    }
};

//解法二:一层一层遍历
class Solution {
public:
    int jump(vector<int>& nums) {
        int n = nums.size();
        int left = 0, right = 0; //每一次跳跃范围的左右端点
        int maxpos = 0; //下一跳范围的右端点
        int ret = 0;
        while(left <= right) //保险写法,以防跳不到n-1的位置
        {
            if(right >= n-1) //判断是否已经能跳到最后位置
                return ret;
            //否则遍历当前层,求下一层的右端点
            for(int i = left; i <= right; ++i)
                maxpos = max(maxpos, i+nums[i]);
            ++ret;
            left = right+1;
            right = maxpos;
        }
        return -1; //跳不到的情况
    }
};

//解法三:贪心
class Solution {
public:
    int jump(vector<int>& nums) {
        int n = nums.size();
        if(n == 1) return 0;
        int cnt = 0;
        for(int i = 0; i < n;)
        {
            if(i+nums[i] >= n-1) //判断下一跳是否已经能跳到最后位置
            {
                ++cnt;
                break;
            }
            //贪心策略:在每一条的范围中选择 当前跳+下一跳 跳地最远地位置
            int maxstep = 0, maxi;
            int j = 1;
            for(; j <= nums[i]; ++j)
            {
                if(j+nums[i+j] > maxstep)
                {
                    maxstep = j+nums[i+j];
                    maxi = i+j;
                }
            }
            i = maxi;
            ++cnt;
        }
        return cnt;
    }
};


2.18 跳跃游戏

题目链接

55. 跳跃游戏 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

同上一题

编写代码

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int n = nums.size();
        int left = 0, right = 0;
        int maxpos = 0;
        while(left <= right)
        {
            if(right >= n-1) 
                return true;
            for(int i = left; i <= right; ++i)
                maxpos = max(maxpos, i+nums[i]);
            left = right+1;
            right = maxpos;
        }
        return false;
    }
};

2.19 加油站

题目链接

134. 加油站 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int n = gas.size();     
        for(int i = 0; i < n;)
        {
            int mass = 0; //油量
            int step = 0;
            for(; step < n; ++step)
            {
                int index = (i+step)%n;
                mass += gas[index]-cost[index];
                if(mass < 0) break; //从当前站能否到下一站
            }
            if(mass >= 0) return i;
            i = i+step+1;
        }
        return -1;
    }
};

2. 20 单调递增的数字

题目链接

738. 单调递增的数字 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        string strn = to_string(n);
        for(int i = 0; i < strn.size()-1; ++i)
        {
            if(strn[i] > strn[i+1])
            {
                while(i-1 >= 0 && strn[i-1] == strn[i])
                    --i;
                --strn[i];
                for(int j = i+1; j < strn.size(); ++j)
                    strn[j] = '9';
            }
        }
        return stoi(strn);
    }
};

2.21 坏了的计算器

题目链接

991. 坏了的计算器 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int brokenCalc(int s, int t) {
        int ret = 0;
        while(t!= s)
        {
            if(t < s)
            {
                ret+=s-t;
                break;
            }
            else
            {
                if(t%2==0) t/=2;
                else ++t;
                ++ret;
            }
        }
        return ret;
    }
};

2.22 合并区间

题目链接

56. 合并区间 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        //先将所有区间按照左端点排序
        sort(intervals.begin(), intervals.end());
        vector<vector<int>> ret;
        int left = intervals[0][0], right = intervals[0][1]; //合并区间的左右端点
        //合并区间
        for(int i = 1; i < intervals.size(); ++i)
        {
            //判断和合并区间是否有交集
            if(intervals[i][0] <= right)
            {
                right = max(right, intervals[i][1]);
            }
            else
            {
                ret.push_back({left, right});
                left = intervals[i][0];
                right = intervals[i][1];
            }
        }
        ret.push_back({left, right}); //将最后一个区间加入结果
        return ret;

    }
};

2.23 无重叠区间

题目链接

435. 无重叠区间 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        int ret = 0;
        sort(intervals.begin(), intervals.end());
        int right = intervals[0][1]; //用于记录最小的右区间端点
        for(int i = 1; i < intervals.size(); ++i)
        {
            if(intervals[i][0] < right) //有重叠
            {
                right = min(right, intervals[i][1]);
                ++ret; //删掉右端点较大者
            }
            else 
            {
                right = intervals[i][1];
            }
        }
        return ret;
    }
};

2.24 用最少数量的箭引爆气球

题目链接

452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        sort(points.begin(), points.end());
        int ret = 0;
        int right = points[0][1]; //交集区间的右端点
        for(int i = 0; i < points.size(); i++)
        {
            if(points[i][0] <= right)
                right = min(right, points[i][1]);
            else
            {
                ++ret; //一支箭射穿所有相交的气球
                right = points[i][1];
            }
        }
        ++ret;
        return ret;
    }
};

2.25 整数替换

题目链接

397. 整数替换 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

//解法一:记忆化搜索
class Solution {
    unordered_map<long, int> hash;
public:
    int integerReplacement(long n) {
        if(hash.count(n)) return hash[n];
        if(n == 1) return 0;
        if(n%2 == 0) hash[n] = integerReplacement(n/2)+1;
        else hash[n] = min(integerReplacement(n+1), integerReplacement(n-1))+1;
        return hash[n];
    }
};

//解法二:贪心
class Solution {
public:
    int integerReplacement(long n) {
        int ret = 0;
        while(n>1)
        {
            if(n%2==0)
                n/=2;
            else 
            {
                if(n == 3 || n%4==1) --n;
                else if(n%4==3) ++n;
            }
            ++ret;
        }
        return ret;
    }
};

2.26 俄罗斯套娃信封问题

题目链接

354. 俄罗斯套娃信封问题 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

提示:为什么要重写排序?

  • 按宽升序排序:最终目的是要将题目改造成最长递增子序列一样的单一限制条件(而本题要求宽高两个条件),因此要先按宽升序排序,这样在后续的贪心过程中就只需要比较高了。
  • 宽相同时,按高降序排序:相同宽度的信封不能套娃,因此要将相同宽度的信封的高降序排序,这样在后续的贪心比较中,这些相同宽度的信封就不会增加套娃长度了。

编写代码

//解法一:动态规划(超时)
class Solution {
public:
    int maxEnvelopes(vector<vector<int>>& env) {
        sort(env.begin(), env.end());
        int n = env.size();
        vector<int> dp(n, 1);
        int ret = 1;
        for(int i = 1; i < n; ++i)
        {
            for(int j = 0; j < i; ++j)
            {
                if(env[i][0]>env[j][0] && env[i][1]>env[j][1])
                {
                    dp[i] = max(dp[i], dp[j]+1);
                }
            }
            ret = max(ret, dp[i]);
        }
        return ret;
    }
};

//解法二:重写排序+贪心+二分
class Solution {
public:
    int maxEnvelopes(vector<vector<int>>& env) {
        //重写排序
        sort(env.begin(), env.end(), [](const vector<int>& a, const vector<int>& b)
        {
            if(a[0] != b[0]) return a[0]<b[0];
            else return a[1]>b[1];
        });
        //贪心+二分
        vector<int> len;
        int n = env.size();
        len.push_back(env[0][1]);
        for(int i = 1; i < n; ++i)
        {
            if(env[i][1] > len.back())
                len.push_back(env[i][1]);
            else
            {
                int left = 0, right = len.size()-1;
                while(left < right)
                {
                    int mid = (left+right)>>1;
                    if(len[mid] < env[i][1])
                        left = mid+1;
                    else
                        right = mid;
                }
                len[left] = env[i][1];
            }
        }
        return len.size();
    }
};

2.27 可被三整除的最大和

题目链接

1262. 可被三整除的最大和 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    int maxSumDivThree(vector<int>& nums) {
        const int INF = 0x3f3f3f3f;
        int x1 = INF, x2 = INF, y1 = INF, y2 = INF;
        int sum = 0;
        for(int e :nums)
        {
            sum+=e;
            if(e%3 == 1)
            {
                if(e < x1) x2 = x1, x1 = e;
                else if(e < x2) x2 = e;
            }
            else if(e%3 == 2)
            {
                if(e < y1) y2 = y1, y1 = e;
                else if(e < y2) y2 = e;
            }
        }
        if(sum%3==1) sum-=min(x1, y1+y2);
        else if(sum%3==2) sum-=min(y1, x1+x2);
        return sum;
    }
};

2.28 距离相等的条形码

题目链接

1054. 距离相等的条形码 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:
    vector<int> rearrangeBarcodes(vector<int>& barcodes) {
        //统计各数字的出现次数,并找出出现最多的数字
        unordered_map<int, int> hash;
        int maxn, maxc=0;
        for(int e : barcodes)
        {
            hash[e]++;
            if(hash[e] > maxc)
            {
                maxc = hash[e];
                maxn = e;
            }
        }
        int n = barcodes.size();
        vector<int> ret(n);
        int i = 0; //先放偶数下标
        //先处理出现次数最多的数字
        while(hash[maxn]>0)
        {
            --hash[maxn];
            ret[i] = maxn;
            i+=2;
        }
        //再处理其他数字
        for(auto& [x, y] : hash)
        {
            while(y>0)
            {
                if(i > n-1) i = 1; //再放奇数下标
                --y;
                ret[i] = x;
                i+=2;
            }
        }
        return ret;
    }
};

2.29 重构字符串

题目链接

767. 重构字符串 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

同上一题

编写代码

class Solution {
public:
    string reorganizeString(string s) {
        unordered_map<char, int> hash;
        char maxn;
        int maxc=0;
        for(char ch : s)
        {
            hash[ch]++;
            if(hash[ch] > maxc)
            {
                maxc = hash[ch];
                maxn = ch;
            }
        }
        int n = s.size();
        if(maxc > (n+1)/2) return ""; //判断以下是否可行
        int i = 0;
        string ret(n, '0');
        while(hash[maxn]>0)
        {
            --hash[maxn];
            ret[i] = maxn;
            i+=2;
        }
        for(auto& [x,y] : hash)
        {
            while(y>0)
            {
                if(i>n-1) i = 1;
                --y;
                ret[i] = x;
                i+=2;
            }
        }
        return ret;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java IO流(详解)

目录 1.概述 2.File文件类 2.1 文件的创建操作 2.2 文件的查找操作 3. File里面一些其他方法 3.1 经典案例 4. IO流 4.1 概念 4.2 IO分类 4.3 字节输出流 4.4 字节输入流 4.5 案例 4.6 字符输出流 4.7 字符输入流 4.8 案例 4.9 处理流--缓冲流 4.10 对象流: 1.…

IP地址定位与智慧城市和智能交通

智慧城市和智能交通是现代城市发展的关键领域&#xff0c;通过先进技术提升城市管理和居民生活质量。IP地址定位在交通监控、智能路灯管理等方面发挥了重要作用&#xff0c;本文将深入探讨其技术实现及应用。 交通监控与优化 通过IP地址连接交通传感器和摄像头&#xff0c;可…

useState函数

seState是一个react Hook(函数)&#xff0c;它允许我们像组件添加一个状态变量&#xff0c;从而控制影响组件的渲染结果 数据驱动试图 本质&#xff1a;和普通JS变量不同的是&#xff0c;状态变量一旦发生变化组件的视图UI也会随着变化(数据驱动试图) 使用 修改状态 注意&am…

H5 Svg 半圆圆环占比图

效果图 主逻辑 /* 虚线长度 */ stroke-dasharray /* 偏移 */ stroke-dashoffset 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge&qu…

基于jeecgboot-vue3的Flowable流程支持bpmn流程设计器与仿钉钉流程设计器-编辑多版本处理

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、前端编辑带有仿钉钉流程的处理 /** 编辑流程设计弹窗页面 */const handleLoadXml (row) > {console.log("handleLoadXml row",row)const params {flowKey: row.key,ver…

React@16.x(60)Redux@4.x(9)- 实现 applyMiddleware

目录 1&#xff0c;applyMiddleware 原理2&#xff0c;实现2.1&#xff0c;applyMiddleware2.1.1&#xff0c;compose 方法2.1.2&#xff0c;applyMiddleware 2.2&#xff0c;修改 createStore 接上篇文章&#xff1a;Redux中间件介绍。 1&#xff0c;applyMiddleware 原理 R…

数据融合工具(10)线重叠检查修复

一、需求背景 先明确一下“线重叠”的定义。 ArcGIS拓扑工具集中的拓扑规则&#xff1a; 不能自重叠&#xff08;线&#xff09; —线要素不得与自身重叠。这些线要素可以交叉或接触但不得有重合的线段。此规则适用于街道等线段可能接触闭合线的要素&#xff0c;但同一街道不得…

深入探讨极限编程(XP):技术实践与频繁发布的艺术

目录 前言1. 极限编程的核心原则1.1 沟通1.2 简单1.3 反馈1.4 勇气1.5 尊重 2. 关键实践2.1 结对编程2.1.1 提高代码质量2.1.2 促进知识共享2.1.3 增强团队协作 2.2 测试驱动开发&#xff08;TDD&#xff09;2.2.1 提升代码可靠性2.2.2 提高代码可维护性2.2.3 鼓励良好设计 2.3…

判断点与圆的位置关系(c++)

可以通过创建两个类来解决问题 &#xff1a; 代码&#xff1a; #include<iostream> using namespace std;class Point { public:void setX(int x){m_X x;}int getX(){return m_X;}void setY(int y){m_Y y;}int getY(){return m_Y;}private:int m_X;int m_Y;};class C…

【系统架构设计师】十一、系统架构设计(中间件|典型应用架构)

目录 九、中间件 9.1 基础概念 9.2 中间件分类 十、典型应用架构 10.1 J2EE和四层结构 10.2 JSPServletJavaBeanDAO 10.3 .NET和J2EE之争 往期推荐 历年真题练习 九、中间件 之前总提到中间件&#xff0c;那么中间件到底是什么&#xff1f;在系统架构中又扮演者什么角…

Spring与设计模式实战之策略模式

Spring与设计模式实战之策略模式 引言 在现代软件开发中&#xff0c;设计模式是解决常见设计问题的有效工具。它们提供了经过验证的解决方案&#xff0c;帮助开发人员构建灵活、可扩展和可维护的系统。本文将探讨策略模式在Spring框架中的应用&#xff0c;并通过实际例子展示…

C++ | Leetcode C++题解之第240题搜索二维矩阵II

题目&#xff1a; 题解&#xff1a; class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m matrix.size(), n matrix[0].size();int x 0, y n - 1;while (x < m && y > 0) {if (matrix[x][y] targ…

LabVIEW异步和同步通信详细分析及比较

1. 基本原理 异步通信&#xff1a; 原理&#xff1a;异步通信&#xff08;Asynchronous Communication&#xff09;是一种数据传输方式&#xff0c;其中数据发送和接收操作在独立的时间进行&#xff0c;不需要在特定时刻对齐。发送方在任何时刻可以发送数据&#xff0c;而接收…

AI自动生成PPT哪个软件好?高效制作PPT优选这4个

7.15初伏的到来&#xff0c;也宣告三伏天的酷热正式拉开序幕~在这个传统的节气里&#xff0c;人们以各种方式避暑纳凉&#xff0c;享受夏日的悠闲时光。 而除了传统的避暑活动&#xff0c;我们还可以用一种新颖的方式记录和分享这份夏日的清凉——那就是通过PPT的方式将这一传…

【Linux】权限管理与相关指令

文章目录 1.权限、文件权限、用户文件权限的理解以及对应八进制数值表示、设置目录为粘滞位文件类型 2.权限相关的常用指令susudochmodchownchgrpumaskwhoamifile 1.权限、文件权限、用户 通过一定条件&#xff0c;拦住一部分人&#xff0c;给另一部分权利来访问资源&#xff0…

Amazon EC2 部署Ollama + webUI

最近和同事闲聊&#xff0c;我们能不能内网自己部署一个LLM&#xff0c;于是便有了Ollama webUI的尝试 对于Linux&#xff0c;使用一行命令即可 curl -fsSL https://ollama.com/install.sh | shollama --help Large language model runnerUsage:ollam…

【Dison夏令营 Day 21】用Python编写绘图

绘画 - 在屏幕上绘制线条和形状。单击标记形状的起点&#xff0c;再次单击标记形状的终点。可使用键盘选择不同的形状和颜色。 """Paint, for drawing shapes.Exercises1. Add a color. 2. Complete circle. 3. Complete rectangle. 4. Complete triangle. 5. A…

大厂面试官问我:为什么Redis的rehash采用渐进式,而Java的hashmap是一次性rehash?【后端八股文十二:Redis hash八股文合集】

本文为【Redis hash八股文合集】初版&#xff0c;后续还会进行优化更新&#xff0c;欢迎大家关注交流~ hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏…

PostgreSQL使用(二)

说明&#xff1a;本文介绍PostgreSQL的DML语言&#xff1b; 插入数据 -- 1.全字段插入&#xff0c;字段名可以省略 insert into tb_student values (1, 张三, 1990-01-01, 88.88);-- 2.部分字段插入&#xff0c;字段名必须写全 insert into tb_student (id, name) values (2,…

Windows 11几个常用的快捷键

WinQ/WinS&#xff1a;快速打开一键搜索 WinCtrlD&#xff1a;快速新建虚拟桌面。可以通过四根手指在触摸板划动进行切换&#xff0c;也可以通过WinTAB进行虚拟桌面切换 WinTAB&#xff1a;虚拟桌面切换 WinA&#xff1a;打开快速设置面板 WinD&#xff1a;快速切换到桌面&a…