LeetCode 71-80题
71题跳过(这是CSP那个目录吗....)
72. 编辑距离
难度困难1136
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
示例 1:
输入:word1 = "horse", word2 = "ros" 输出:3 解释: horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e')
示例 2:
输入:word1 = "intention", word2 = "execution" 输出:5 解释: intention -> inention (删除 't') inention -> enention (将 'i' 替换为 'e') enention -> exention (将 'n' 替换为 'x') exention -> exection (将 'n' 替换为 'c') exection -> execution (插入 'u')
先用递归来一个
再用动规来一个
因为不知道哪个次数最少,所以都拉来一遍看min
递归:
unordered_map<pair<int,int>,int> mp;这样就用,嘤嘤嘤。。。。int get(int i,int j,string word1,string word2){pair<int,int> p(i,j); if(i==-1) mp[p]=j+1;if(j==-1) mp[p]=i+1;if(word1[i]==word2[j]){if(!mp.count(p))mp[p]=get(i-1,j-1,word1,word2);}else{if(!mp.count(p))mp[p]=min(get(i-1,j-1,word1,word2)+1,min(get(i-1,j,word1,word2)+1,get(i,j-1,word1,word2)+1));}return mp[p];}
重叠子问题
自底而上的思考。
int minDistance(string word1, string word2) {// int i=word1.size()-1;// int j=word2.size()-1;// return get(i,j,word1,word2);//但是base是-1 !!int n=word1.size();int m=word2.size();vector<vector<int>> dp(n+1,vector<int>(m+1,0));for(int i=0;i<=n;i++) dp[i][0]=i;for(int j=0;j<=m;j++) dp[0][j]=j;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(word1[i-1]==word2[j-1])dp[i][j]=dp[i-1][j-1];else dp[i][j]=min(dp[i-1][j-1]+1,min(dp[i-1][j]+1,dp[i][j-1]+1));}}return dp[n][m];}
73. 矩阵置零
难度中等290
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
示例 1:
输入: [[1,1,1],[1,0,1],[1,1,1] ] 输出: [[1,0,1],[0,0,0],[1,0,1] ]
示例 2:
输入: [[0,1,2,0],[3,4,5,2],[1,3,1,5] ] 输出: [[0,0,0,0],[0,4,5,0],[0,3,1,0] ]
进阶:
- 一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
- 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
- 你能想出一个常数空间的解决方案吗?
class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {set<int> col,row;for(int i=0;i<matrix.size();i++){for(int j=0;j<matrix[0].size();j++){if(matrix[i][j]==0){col.insert(j);row.insert(i);}}}for(auto i:row){for(int j=0;j<matrix[0].size();j++){matrix[i][j]=0;}}for(auto j:col){for(int i=0;i<matrix.size();i++){matrix[i][j]=0;}}return;}
};
public void setZeroes(int[][] matrix) {if(matrix == null || matrix.length == 0)return;int m = matrix.length, n = matrix[0].length;boolean firstRow = false, firstCol = false;//步骤一for(int i = 0; i < m; i++){if(matrix[i][0] == 0)firstCol = true;}for(int j = 0; j < n; j++){if(matrix[0][j] == 0)firstRow = true;}//步骤二for(int i = 1; i < m; i++){for(int j = 1; j < n; j++){if(matrix[i][j] == 0){matrix[i][0] = 0;matrix[0][j] = 0;}}}//步骤三for(int i = 1; i < m; i++){if(matrix[i][0] == 0){for(int j = 0; j < n; j++)matrix[i][j] = 0;}}for(int j = 1; j < n; j++){if(matrix[0][j] == 0){for(int i = 0; i < m; i++)matrix[i][j] = 0;}}//步骤四if(firstRow){for(int j = 0; j < n; j++)matrix[0][j] = 0;}if(firstCol){for(int i = 0; i < m; i++)matrix[i][0] = 0;}
}作者:lan-se-bei-ban-qiu
链接:https://leetcode-cn.com/problems/set-matrix-zeroes/solution/ju-zhen-zhi-0de-liang-chong-fang-fa-by-lan-se-bei-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
74. 搜索二维矩阵
难度中等239
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入: matrix = [[1, 3, 5, 7],[10, 11, 16, 20],[23, 30, 34, 50] ] target = 3 输出: true
示例 2:
输入: matrix = [[1, 3, 5, 7],[10, 11, 16, 20],[23, 30, 34, 50] ] target = 13 输出: false
class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m=matrix.size();if(m==0) return false;int n=matrix[0].size();int x=m-1;int y=0;while(x>=0&&x<m&&y>=0&&y<n){if(target==matrix[x][y]) return true;else if(target<matrix[x][y]) x--;else y++;}return false;}
};
75. 颜色分类
难度中等578
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2]
进阶:
- 一个直观的解决方案是使用计数排序的两趟扫描算法。
首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 - 你能想出一个仅使用常数空间的一趟扫描算法吗?
解法很聪明哦
做对这道题需要熟悉快速排序的 partition 过程。
partition 过程经过一次扫描把整个数组分成三个部分,正好符合这个问题的场景。
写对这道题的方法是,把我们对循环不变量的定义作为注释先写出来,然后再编码。
作者:liweiwei1419
链接:https://leetcode-cn.com/problems/sort-colors/solution/kuai-su-pai-xu-partition-guo-cheng-she-ji-xun-huan/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:void sortColors(vector<int>& nums) {int l=0, r=nums.size()-1;int cur=0;while(cur<=r){if(nums[cur]==0){swap(nums[cur],nums[l]);l++;cur++;}else if(nums[cur]==2){swap(nums[cur],nums[r]);r--;}else cur++;}return;}
};
76. 最小覆盖子串
难度困难745
给你一个字符串 S、一个字符串 T 。请你设计一种算法,可以在 O(n) 的时间复杂度内,从字符串 S 里面找出:包含 T 所有字符的最小子串。
示例:
输入:S = "ADOBECODEBANC", T = "ABC" 输出:"BANC"
提示:
- 如果 S 中不存这样的子串,则返回空字符串
""
。 - 如果 S 中存在这样的子串,我们保证它是唯一的答案。
滑动窗口的关键是什么!!!
string minWindow(string s, string t) {//滑动窗口还用说吗...unordered_map<char,int> need,window;for(char i:t) need[i]++;int valid=0;//是否包含int left=0,right=0;int st,len=INT_MAX;while(right<s.size()){char c=s[right++];if(need.count(c)){window[c]++;if(window[c]==need[c]) valid++;}//何时shrinkwhile(need.size()==valid){//更新答案,关键在于lenif(right-left<len){st=left;len=right-left;}char c=s[left++];if(need.count(c)){if(window[c]==need[c]) valid--;window[c]--;}}}return len==INT_MAX?"":s.substr(st,len);}
77. 组合
难度中等394
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]
class Solution {
public:void get(vector<int>& temp,int num,int k,vector<vector<int>> &ans,int index,int n){if(num==k){ans.push_back(temp);return;}if(index==n+1||num>k) return;temp.push_back(index);get(temp,num+1,k,ans,index+1,n);temp.pop_back();get(temp,num,k,ans,index+1,n);}vector<vector<int>> combine(int n, int k) {vector<vector<int>> ans;if(n==0||k==0) return ans;vector<int> temp;get(temp,0,k,ans,1,n);return ans;}
};
78. 子集
难度中等749
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3] 输出: [[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[] ]
class Solution {
public:vector<int> tmp;void get(int xuan,int sum,int n,vector<vector<int>> &ans,vector<int>& nums){if(sum==n){// if(xuan==0) return;ans.push_back(tmp);return;}get(xuan,sum+1,n,ans,nums);tmp.push_back(nums[sum]);get(xuan+1,sum+1,n,ans,nums);tmp.pop_back();}vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> ans;// ans.push_back({});//每一个元素,选或者不选~get(0,0,nums.size(),ans,nums);return ans;}
};
79. 单词搜索
难度中等611
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E'] ]给定 word = "ABCCED", 返回 true 给定 word = "SEE", 返回 true 给定 word = "ABCB", 返回 false
提示:
board
和word
中只包含大写和小写英文字母。1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3
class Solution {
public:int t[4][2]={{0,1},{0,-1},{1,0},{-1,0}};bool ans=false;void get(vector<vector<char>>& board,vector<vector<bool>>& visit,int index,string word,int x,int y,int n,int m){if(ans) return;if(index==word.size()-1&&board[x][y]==word[index]){ans= true;return;}if(board[x][y]==word[index]){visit[x][y]=true;for(int i=0;i<4;i++){int tx=x+t[i][0];int ty=y+t[i][1];if(tx<0||ty<0||tx>=n||ty>=m||visit[tx][ty]==true) continue;get(board,visit,index+1,word,tx,ty,n,m);}visit[x][y]=false;}}bool exist(vector<vector<char>>& board, string word) {//这就是简单的dfs吧..int n=board.size();int m=board[0].size();vector<vector<bool>> visit(n,vector<bool>(m,false));for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(visit[i][j]==false){get(board,visit,0,word,i,j,n,m);if(ans) return ans;}}}return false;}
};
80. 删除排序数组中的重复项 II
难度中等285
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定 nums = [1,1,1,2,2,3],函数应返回新长度 length =5
, 并且原数组的前五个元素被修改为1, 1, 2, 2,
3 。你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,0,1,1,1,1,2,3,3],函数应返回新长度 length =7
, 并且原数组的前五个元素被修改为0
, 0, 1, 1, 2, 3, 3 。你不需要考虑数组中超出新长度后面的元素。
//这个我不会!!!!我的天
看了下有条件没应用啊,这个nums[index-k+1] 怪不得
class Solution {public int removeDuplicates(int[] nums) {int i = 0;for (int n : nums) {if (i < 2 || n > nums[i-2]) nums[i++] = n;}return i;}
}
LeetCode 71-80题相关推荐
- Leetcode每日必刷题库第80题,如何在不使用外部空间的情况下对有序数组去重?
LeetCode的第80题,有序数组去重II(Remove Duplicates from Sorted Array II). 这题的官方难度是Medium,通过率是43.3%,点赞1104,反对69 ...
- Leetcode重点250题
LeetCode重点250题 这个重点题目是把LeetCode前400题进行精简.精简方法如下: 删除不常考,面试低频出现题目 删除重复代码题目(例:链表反转206题,代码在234题出现过) 删除过于 ...
- LeetCode 简单算法题
使用Nodejs 抓取的LeetCode 简单算法题 一步一步来,先攻破所有简单的题目,有些题目不适合使用JS解决,请自行斟酌 Letcode 简单题汇总 104. Maximum Depth of ...
- 刷题汇总(一)leetcode 精选50题 JavaScript答案总结
题目来源 腾讯精选练习(50 题) 信息更新时间:2019-3-11,因为要准备面前端,就用js做了遍来熟悉JavaScript这门语言,50道题均已提交通过. GitHub地址:https://gi ...
- [汇总III]微软等公司数据结构+算法面试第1-80题[前80题首次集体亮相]
[整理III]微软等公司数据结构+算法面试第1-80题汇总 ---首次一次性汇总公布 由于这些题,实在太火了.所以,应广大网友建议要求,在此把之前已整理公布的前80题, 现在,一次性分享出来.此也算是 ...
- c语言最长递增子序列nlogn,十月常见算法考题、最长递增子序列,Leetcode第300题最长上升子...
十月常见算法考题.最长递增子序列,Leetcode第300题最长上升子 十月常见算法考题.最长递增子序列,Leetcode第300题最长上升子序列的变种,我没见过乔丹,今天詹姆斯就是我的神! @Aut ...
- 刷题汇总(三)leetcode 精选50题 C++答案总结
题目来源 腾讯精选练习(50 题) 相关: 刷题汇总(一)leetcode 精选50题 JavaScript答案总结 刷题汇总(二)剑指Offer 66题 C++答案总结 刷题汇总(四)技术类编程题汇 ...
- leetcode分类刷题笔记
leetcode分类刷题笔记--基于python3 写在前面 1.做题如果实在想不出时间复杂度比较优的解法,可以先写出暴力解法,尝试在其基础上优化 2.排序.双指针.二分等--经常可以优化时间复杂度 ...
- 【Leetcode】 刷题之路1(python)
leetcode 刷题之路1(python) 看到有大佬总结了一些相关题目,想着先刷一类. 1.两数之和 15.三数之和 16.最接近的三数之和 11.盛最多的水 18.四数之和 454.四数相加II ...
- 15.使用一样的BFS方法(代码几乎一模一样)解决多道LeetCode题目--542题(01矩阵)1765题(地图中的最高点)994腐烂的橘子
一.综述 本文总结自己刷LeetCode中遇到的使用BFS方法解决相同类型的题目.(代码几乎是一模一样) 二.01矩阵(LeetCode第542题) class Solution {int[][] d ...
最新文章
- Python 学习笔记01
- 如何获取boss直聘搜索牛人被屏蔽的姓名
- Python+selenium 自动化-切换窗口页签、切换iframe框架。确定页面是否包含iframe方法。
- Java中如何读取文件夹下的所有文件
- 每天学一点flash(75) ToolTip 提示
- centos-修改分辨率
- dos创建mysql数据库_用命令创建MySQL数据库
- 【验证码识别】基于matlab CNN卷积神经网络验证码识别【含Matlab源码 098期】
- 【转】网站挂马和端口抓鸡经验总结
- 基于matlab的图像复原,MATLAB在图像复原中的应用
- 计算机主板时钟,电脑主板时钟电路工作原理
- AR人脸识别 Three.js + tensorflow.js(一)
- getshell之Nexus远程命令执行(CVE-2020-10199)
- hubot+slack(hubot部分)
- 用qrcode生成微信支付二维码
- 友盟统计,h5 API
- 第二、三代基因组测序数据混合拼接软件综述
- sql 数据库显示 正在恢复
- 【Python游戏】Python魔塔样板,自带Demo游戏内容(Powered by Pygame)| 附带源码
- 胡润研究院第二年发布中国豪华车品牌特性研究白皮书
热门文章
- 2021年中国驴行业存栏量延续下降走势,存栏基数降低使得驴肉供应减少,价格持续走强[图]
- 【关于微信小程序登录信息】 微信即将不再支持wx.getUserInfo() 授权弹出框 2018年5月12日
- word文件图标无法显示的问题
- 小程序中wxs的使用
- 乌镇互联网大会:大佬们都爱AI
- 30 行代码实现蚂蚁森林自动偷能量
- 风险管理中的风险预测、风险评估、风险控制
- matlab抢占时隙算法,基于公平性的D2D时隙调度算法
- PPT文件设置打开密码的两种方法
- RTX3060Ti和RTX2060 SUPER,RTX2080 SUPER、RTX3070显卡参数参数对比哪个好 差距大不大