leetcode解题思路分析(一百二十八)1053 - 1078 题
- 交换一次的先前排列
给你一个正整数的数组 A(其中的元素不一定完全不同),请你返回可在 一次交换(交换两数字 A[i] 和 A[j] 的位置)后得到的、按字典序排列小于 A 的最大可能排列。如果无法这么操作,就请返回原数组。
贪心算法,先从后往前找到第一个可以变的位置,然后在从该位置往后找到最大的值进行调整
class Solution {public:vector<int> prevPermOpt1(vector<int>& arr) {int n = arr.size(), idx = -1;for(int i=n-1; i>=1; i--){if(arr[i] < arr[i-1]){idx = i-1;break;}}if(idx == -1) return arr;int maxv = 0, t = arr[idx], pos = idx;for(int i = idx+1; i<n; i++){if(arr[i] < arr[idx]){if(arr[i] > maxv){maxv = arr[i];pos = i;}}}swap(arr[idx], arr[pos]);return arr;}
};
- 距离相等的条形码
在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。
哈希+堆
class Solution {public:vector<int> rearrangeBarcodes(vector<int>& barcodes) {unordered_map<int,int>num2cnt;int n=barcodes.size();for(int i=0;i<n;i++){num2cnt[barcodes[i]]++;}priority_queue<pair<int,int>>maxHeap;for(auto mPair:num2cnt)maxHeap.push({mPair.second,mPair.first});vector<int>ans;while(maxHeap.empty()==false){auto [firstCnt,firstNum]=maxHeap.top();maxHeap.pop();if(ans.empty()||ans.back()!=firstNum){ans.push_back(firstNum);firstCnt--;if(firstCnt==0)continue;maxHeap.push({firstCnt,firstNum});}else {auto [secondCnt,secondNum]=maxHeap.top();maxHeap.pop();maxHeap.push({firstCnt,firstNum});ans.push_back(secondNum);secondCnt--;if(secondCnt==0)continue;maxHeap.push({secondCnt,secondNum});}}return ans;}
};
- 字符串的最大公因子
对于字符串 s 和 t,只有在 s = t + … + t(t 自身连接 1 次或多次)时,我们才认定 “t 能除尽 s”。
给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 X 能除尽 str2 。
字符串两种顺序拼接后相等,则一定是可以找到公共子串,然后求其长度的公约数,即为最大字串。
class Solution {public:string gcdOfStrings(string str1, string str2) {if (str1 + str2 != str2 + str1) return "";return str1.substr(0, __gcd((int)str1.length(), (int)str2.length())); // __gcd() 为c++自带的求最大公约数的函数}
};
- 按列翻转得到最大值等行数
给定 m x n 矩阵 matrix 。你可以从中选出任意数量的列并翻转其上的 每个 单元格。(即翻转后,单元格的值从 0 变成 1,或者从 1 变为 0 。)返回 经过一些翻转后,行与行之间所有值都相等的最大行数 。
1、每一行都是一个0-1串,计算各行的特征,特征可以用字符串形式表示
2、建立哈希表,key为特征值,value为特征是key的行的个数
3、最大的value即为所求
class Solution {public:int maxEqualRowsAfterFlips(vector<vector<int>>& matrix) {int m=matrix.size(), n=matrix[0].size();unordered_map<string, int> map; // 统计具有某特征的行的个数for(int i=0;i<m;++i){string feature; // 特征以字符串表示for(int j=0;j<n;++j)feature.push_back(matrix[i][j]);// 若当前行的首位为0,需要进行翻转if(feature[0]==0){for(int j=0;j<n;++j)feature[j]=1-feature[j];}++map[feature]; // 计数}int ans=0;for(auto p:map)ans=max(ans, p.second);// 取最大值return ans;}
};
- 负二进制数相加
给出基数为 -2 的两个数 arr1 和 arr2,返回两数相加的结果。
class Solution {public:vector<int> addNegabinary(vector<int>& arr1, vector<int>& arr2) {int n1 = arr1.size();int n2 = arr2.size();int n = max(n1,n2)+4;vector<int> res(n, 0);// 和arr1和arr2 倒序的计算,低位在前面for (int i = n1-1; i >= 0; --i){res[n1-1-i] += arr1[i];}for (int i = n2-1; i >= 0; --i){res[n2-1-i] += arr2[i];}// 从低位开始计算for (int i = 0; i +2 < n; ++i){// 进位int carry = res[i] >> 1;res[i] &= 1;res[i+1] += carry;res[i+2] += carry;}// 观察最高位连续零需要移除int k = n-3;// 这里结束是0,来避免0,0->空的情况while (k > 0 && res[k] == 0){--k;}reverse(res.begin(), res.begin()+k+1);// 移除末尾的为0的部分int i = n-k-1;while(i > 0){--i;res.pop_back();}return res;}
};
- 元素和为目标值的子矩阵数量
给出矩阵 matrix 和目标值 target,返回元素总和等于目标值的非空子矩阵的数量。
前缀和的二维应用
class Solution {private:int subarraySum(vector<int> &nums, int k) {unordered_map<int, int> mp;mp[0] = 1;int count = 0, pre = 0;for (auto &x:nums) {pre += x;if (mp.find(pre - k) != mp.end()) {count += mp[pre - k];}mp[pre]++;}return count;}public:int numSubmatrixSumTarget(vector<vector<int>> &matrix, int target) {int ans = 0;int m = matrix.size(), n = matrix[0].size();for (int i = 0; i < m; ++i) { // 枚举上边界vector<int> sum(n);for (int j = i; j < m; ++j) { // 枚举下边界for (int c = 0; c < n; ++c) {sum[c] += matrix[j][c]; // 更新每列的元素和}ans += subarraySum(sum, target);}}return ans;}
};
- Bigram 分词
给出第一个词 first 和第二个词 second,考虑在某些文本 text 中可能以 “first second third” 形式出现的情况,其中 second 紧随 first 出现,third 紧随 second 出现。对于每种这样的情况,将第三个词 “third” 添加到答案中,并返回答案。
先按空格分组单词,然后遍历即可
class Solution {public:vector<string> findOcurrences(string text, string first, string second) {vector<string> words;int s = 0, e = 0, len = text.length();while (true) {while (s < len && text[s] == ' ') {s++;}if (s >= len) {break;}e = s + 1;while (e < len && text[e] != ' ') {e++;}words.push_back(text.substr(s, e - s));s = e + 1;}vector<string> ret;for (int i = 2; i < words.size(); i++) {if (words[i - 2] == first && words[i - 1] == second) {ret.push_back(words[i]);}}return ret;}
};
leetcode解题思路分析(一百二十八)1053 - 1078 题相关推荐
- 教你一百二十八个说话的技巧(气质很内涵)(有霸气不霸道)
教你一百二十八个说话的技巧(气质很内涵)(有霸气不霸道) 1.说话不要有攻击性,不要有杀伤力,不夸已能,不扬人恶,自然能化敌为友. 2.一个常常看别人缺点的人,自己本身就不够好,因为他没有时间检讨他 ...
- leetcode解题思路分析(一百三十四)1131 - 1143 题
1131.绝对值表达式的最大值 给你两个长度相等的整数数组,返回下面表达式的最大值: |arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j| 其中下标 ...
- leetcode解题思路分析(一百三十)1093 - 1096 题
大样本统计 我们对 0 到 255 之间的整数进行采样,并将结果存储在数组 count 中:count[k] 就是整数 k 在样本中出现的次数. 计算以下统计数据: minimum :样本中的最小元素 ...
- leetcode解题思路分析(一百零二)874 - 880 题
模拟行走机器人 机器人在一个无限大小的 XY 网格平面上行走,从点 (0, 0) 处开始出发,面向北方.该机器人可以接收以下三种类型的命令 commands : -2 :向左转 90 度 -1 :向右 ...
- leetcode解题思路分析(一百零七)909 - 915 题
蛇梯棋 给你一个大小为 n x n 的整数矩阵 board ,方格按从 1 到 n2 编号,编号遵循 转行交替方式 ,从左下角开始 (即,从 board[n - 1][0] 开始)每一行交替方向.返回 ...
- Android开发笔记(一百二十八)手机制式适配
查看运营商与网络类型 虽然现在4G网络很普及了,但是我国幅员辽阔,4G信号在某些地方接收不良,手机连接很容易掉到3G甚至2G网络.为了让用户在低速环境也能使用App的基础功能,而不至于还在老牛破车地缓 ...
- mediasoup 源码分析(二十八)rtx 重传包
文章目录 rtx 协议格式 字段细节 上行rtx处理 下行rtx处理 rtx 主要用来进行封装重传包 rtx 协议格式 The format of a retransmission packet is ...
- 2021年安全生产工作总结及2022年思路计划(二十八篇)PPTX(附下载)
摘要:2021年安全生产工作总结及2022年思路计划(二十八篇) 公众号:安全生产星球
- leetcode解题思路(无代码) 归类汇总版,面试笔试经典例题
我将舍弃没有巧妙解法的简单题.部分题干.代码实现.非关键步骤,目的是做成一篇每次面试前都能过一遍的思路问答题. 在我仅有的面试经验中,面试官似乎会按知识点提问.因此我认为归类极其重要. 简单的题不一定 ...
- 深度学习之图像分类(二十八)-- Sparse-MLP(MoE)网络详解
深度学习之图像分类(二十八)Sparse-MLP(MoE)网络详解 目录 深度学习之图像分类(二十八)Sparse-MLP(MoE)网络详解 1. 前言 2. Mixture of Experts 2 ...
最新文章
- 确定安全威胁与漏洞-A
- 腾讯发布95页重磅报告:全面预测中国互联网未来5年趋势
- 汇编--条件跳转指令
- 安装debian的zabbix-agent客户端
- 线程 sleep 取消_C/C++ 多线程机制
- java generic new_java中generic实例详解
- mysql循环map_java Map 遍历速度最优解
- LDAPimplementation
- 【报告分享】2020年抖音美妆直播报告.pdf(附下载链接)
- python%20是什么东西
- MySql 存储大量长字节 Text报错处理办法
- python 输出list到txt_python脚本生成caffe train_list.txt的方法
- 科技创新 可持续发展 论坛_可持续发展时间
- MySQL数据库学习资料(六)
- linux ubuntu安装svn,在Ubuntu下安装SVN工具RabbitVCS
- java orb 是什么_什么是ORB
- 教师对php作品评语通用,期末教师给学生的评语
- linux chmod 777 dev,ubuntu – 撤消chmod 777
- NASA研制3D食物打印机:原料或取自昆虫
- iPhone开发 - 3D - 建立3D界面(下)