10.2(583. 两个字符串的删除操作 80. 删除排序数组中的重复项 II)

2024-03-30 01:32

本文主要是介绍10.2(583. 两个字符串的删除操作 80. 删除排序数组中的重复项 II),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

583. 两个字符串的删除操作

思路:
求出最大公共子列和,然后把总长度减去两倍的公共子列和的长度即可。
效率:100%
程序代码:
#include <iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<sstream>
#include<stack>//引入数据结构堆栈
//583. 两个字符串的删除操作
//思路、找到最长公共子列的长度即可(动态规划)
using namespace std;
class Solution {
public:int minDistance(string word1, string word2) {int sum = word1.size() + word2.size();//表示一共的长度int m = word1.size();int n = word2.size();vector<vector<int>> matrix(m+1);vector<int> vec(n+1);//都想外围扩展了一圈//首先进行初始化for (int i = 0; i < m + 1; i++) {for (int j = 0; j < n + 1; j++) {vec[j] = 0;}matrix[i] = vec;}for (int i = 1; i < m + 1; i++) {for (int j = 1; j < n + 1; j++) {if (word1[i-1] == word2[j-1]) matrix[i][j] = matrix[i - 1][j - 1]+1;else matrix[i][j] = max(matrix[i-1][j],matrix[i][j-1]);}}return (sum - 2*matrix[m][n]);}int max(int &a, int &b) {return (a > b ? a : b);}};int main()
{Solution bb;string word1, word2;cin >> word1 >> word2;cout<<bb.minDistance(word1,word2)<<endl;return 0;
}

80. 删除排序数组中的重复项 II

思路:使用向量自带的删除函数进行删除,感觉效率可能不高,我觉得每一次删除可能都是后面的所有内容进行一次移动(还没看迭代器的相关知识,自我感觉是全体的移动)
效率:12.62%,果然低得感人。。。。必须得改进。。。
程序代码:
#include <iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<sstream>
#include<stack>//引入数据结构堆栈
//80. 删除排序数组中的重复项 II
//思路、直接在原有的基础上删除,使用erase函数,但是感觉效率应该不会很高,还可以使用其他的方法
using namespace std;class Solution {
public:int removeDuplicates(vector<int>& nums) {int n = nums.size();if (n == 0||n==1||n==2)return n;vector<int>::iterator i = nums.begin()+2;    //从向量申请迭代器while(i!=nums.end()) {if (*i == *(i-1) && *i == *(i-2)) i=nums.erase(i);else i++;}return nums.size();}
};int main()
{Solution bb;int n;//表示数组的数量cin >> n;vector<int> nums(n);for (int i = 0; i < n; i++) {cin >> nums[i];}cout<<bb.removeDuplicates(nums)<<endl;return 0;
}

使用原位交换算法得到的程序代码如下:
效率:37.21% 。。。。。。无语

#include <iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<sstream>
#include<stack>//引入数据结构堆栈
//80. 删除排序数组中的重复项 II
//思路、直接在原有的基础上删除,使用erase函数,但是感觉效率应该不会很高,还可以使用其他的方法
using namespace std;class Solution {
public:int removeDuplicates(vector<int>& nums) {int n = nums.size();if (n == 0 || n == 1 || n == 2) return n;int i = 2, j = 3;while (j <n) {if (nums[j] == nums[i - 1] && nums[j] == nums[i - 2])j++;else if(nums[i]==nums[i-1]&&nums[i]==nums[i-2]||(nums[j] != nums[i - 1] || nums[j] != nums[i - 2])&&(nums[i]<nums[i-1])){swap(nums[i], nums[j]);i++;j++;}else {i++;j++;}}if ((nums[i] != nums[i - 1] || nums[i] != nums[i - 2])&&nums[i]>=nums[i-1]) i++;return i;//返回的结果就是i}void swap(int &a, int &b) {int tmp = a;a = b;b = tmp;}};int main()
{Solution bb;int n;//表示数组的数量cin >> n;vector<int> nums(n);for (int i = 0; i < n; i++) {cin >> nums[i];}cout<<bb.removeDuplicates(nums)<<endl;return 0;
}

以下是排名第一的方法:

static const auto __ = []() {ios::sync_with_stdio(false);cin.tie(nullptr);return nullptr;
}();class Solution {
public:int removeDuplicates(vector<int>& nums) {if(nums.empty())return 0;int index = 1;int notRepeat = 1;int count = 1;int lastNum = nums[0];for(int i = 1; i < nums.size(); i++){if(nums[i] == lastNum){count++;if(count <= 2){swap(nums[index], nums[i]);index++;}}else{count = 1;lastNum = nums[i];swap(nums[index], nums[i]);index++;}}return index;}
};

优秀!!其实和我的思路差不多,之不是改成通过计数的方式了。

这篇关于10.2(583. 两个字符串的删除操作 80. 删除排序数组中的重复项 II)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/860176

相关文章

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

使用JavaScript将PDF页面中的标注扁平化的操作指南

《使用JavaScript将PDF页面中的标注扁平化的操作指南》扁平化(flatten)操作可以将标注作为矢量图形包含在PDF页面的内容中,使其不可编辑,DynamsoftDocumentViewer... 目录使用Dynamsoft Document Viewer打开一个PDF文件并启用标注添加功能扁平化

JavaScript DOM操作与事件处理方法

《JavaScriptDOM操作与事件处理方法》本文通过一系列代码片段,详细介绍了如何使用JavaScript进行DOM操作、事件处理、属性操作、内容操作、尺寸和位置获取,以及实现简单的动画效果,涵... 目录前言1. 类名操作代码片段代码解析2. 属性操作代码片段代码解析3. 内容操作代码片段代码解析4.

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输