wy的leetcode刷题记录_Day69
分类:
Code
简介:wy的leetcode刷题记录_Day68声明本文章的所有题目信息都来源于leetcode如有侵权请联系我删掉!时间:2023 6 7前言@TOC2611. 老鼠和奶酪2611. 老鼠和奶酪题目介绍有两只老鼠和 n 块不同类型的奶酪,每块奶酪都只能被其中一只老鼠吃掉。下标为 i 处的奶酪被吃掉的得分为:如果第一只老鼠吃掉,则得分为 reward1[i] 。如果第二只老鼠吃掉,则得分为 reward2[i] 。给你一个正整数数组 reward1 ,一个正整数数组 reward2 ,和一个非负整数 k 。请你返回第一只老鼠恰好吃掉 k 块奶酪的情况下,最大得分为多少。示例 1:输入:reward1 = [1,1,3,4], reward2 = [4,4,1,1], k = 2 输出:15解释:这个例子中,第一只老鼠吃掉第 2 和 3 块奶酪(下标从 0 开始),第二只老鼠吃掉第 0 和 1 块奶酪。 总得分为 4 + 4 +3 + 4 = 15 。 15 是最高得分。 示例 2:输入:reward1 = [1,1], reward2 = [1,1], k = 2 输出:2 解释:这个例子中,第一只老鼠吃掉第 0 和1 块奶酪(下标从 0 开始),第二只老鼠不吃任何奶酪。 总得分为 1 + 1 = 2 。 2 是最高得分。思路简单的贪心+模拟:新建立一个数组reward3用来记录reward1和reward2的差,我们假设老鼠2吃完了所有的奶酪,但是此时要求老鼠1也需要吃k个并得分最大,这时我们将reward3对应的加入reward2就是reward1中的值,那么我们只需要将reward3中最大的k个加入reward2中即可。代码class Solution {
public:
int miceAndCheese(vector<int>& reward1, vector<int>& reward2, int k) {
int n=reward1.size();
vector<int> reward3(n);
int ans=0;
for(int i=0;i<n;i++)
{
ans+=reward2[i];
reward3[i]=reward1[i] reward2[i];
}
sort(reward3.begin(),reward3.end(),greater<int>());
for(int i=0;i<k;i++)
{
ans+=reward3[i];
}
return ans;
}
};收获简单的贪心+模拟
折半查找(二分查找)
分类:
Code
简介:考研时需要学习的一个算法,这里手打实现一个简单的折半查找折半查找(二分查找)介绍折半查找法是效率较高的一种查找方法。假设有已经按照从小到大的顺序排列好的五个整数a0~a4,要查找的数是X,其基本思想是: 设查找数据的范围下限为l=0,上限为h=4,求中点m=(l+h)/2,用X与中点元素am比较,若X等于am,即找到,停止查找;否则,若X大于am,替换下限l=m+1,到下半段继续查找;若X小于am,换上限h=m 1,到上半段继续查找;如此重复前面的过程直到找到或者l>h为止。如果l>h,说明没有此数,打印找不到信息,程序结束。 。实现递归#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//vector<int> array;
int BineraySearch(int* a,int left,int right,int target)//返回所在下标
{
if(left>right)
return 1;
int mid = (right left) / 2 + left;
cout<<left<<" "<<mid<<" "<<right<<endl;
if(a[mid]<target)
{
left = mid + 1;
}
else if(a[mid]>target)
{
right = mid 1;
}
else
{
return mid;
}
BineraySearch(a,left,right,target);
}
int main()
{
int target=0;
cin >> target;
cout<<BineraySearch(a,1,10,target);
return 0;
}
非递归#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int main()
{
int target=0;
cin >> target;
// cout<<BineraySearch(a,1,10,target);
int left=0;
int right=9;
while(left<=right)
{
int mid = (right left) / 2 + left;
cout<<left<<" "<<mid<<" "<<right<<endl;
if(a[mid]<target)
{
left = mid + 1;
}
else if(a[mid]>target)
{
right = mid 1;
}
else
{
cout<<mid<<endl;
break;
}
}
if(left>right)
cout<<"Failed"!<<endl;
return 0;
}
wy的leetcode刷题记录_Day68
分类:
Code
简介:wy的leetcode刷题记录_Day68声明本文章的所有题目信息都来源于leetcode如有侵权请联系我删掉!时间:2023 6 6前言@TOC1019. 链表中的下一个更大节点2352. 相等行列对题目介绍给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ,返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。示例 1:输入:grid = [[3,2,1],[1,7,6],[2,7,7]] 输出:1 解释:存在一对相等行列对:(第 2 行,第 1 列):[2,7,7]示例 2:输入:grid = [[3,1,2,2],[1,4,4,5],[2,4,2,2],[2,4,2,2]] 输出:3 解释:存在三对相等行列对:(第 0 行,第 0 列):[3,1,2,2](第 2 行, 第 2 列):[2,4,2,2](第 3 行, 第 2 列):[2,4,2,2]思路1.暴力解法:提出每一行的元素与每一列的元素进行比对。(简易优化思路:空间换时间,建立2n个序列,分别保留每行和每列的元素,再进行比较)2.哈希表(上面解法的建议优化思路):首先将矩阵的行放入哈希表中统计次数,哈希表的键可以是将行拼接后的字符串,也可以用各语言内置的数据结构,然后分别统计每一列相等的行有多少,求和即可。代码class Solution {
public:
int equalPairs(vector<vector<int>>& grid) {
int n = grid.size();
map<vector<int>, int> cnt;
for (auto row : grid) {
cnt[row]++;
}
int res = 0;
for (int j = 0; j < n; j++) {
vector<int> arr;
for (int i = 0; i < n; i++) {
arr.emplace_back(grid[i][j]);
}
if (cnt.find(arr) != cnt.end()) {
res += cnt[arr];
}
}
return res;
}
};
收获简单的模拟题
wy的leetcode刷题记录_Day61
分类:
Code
简介:wy的leetcode刷题记录_Day61声明本文章的所有题目信息都来源于leetcode如有侵权请联系我删掉!时间:2022 12 26前言@TOC1759. 统计同构子字符串的数目今天的每日一题是:1759. 统计同构子字符串的数目题目介绍给你一个字符串 s ,返回 s 中 同构子字符串 的数目。由于答案可能很大,只需返回对 109 + 7 取余 后的结果。同构字符串 的定义为:如果一个字符串中的所有字符都相同,那么该字符串就是同构字符串。子字符串 是字符串中的一个连续字符序列。示例 1: 输入:s = "abbcccaa" 输出:13 解释:同构子字符串如下所列: "a" 出现 3 次。 "aa" 出现 1次。 "b" 出现 2 次。 "bb" 出现 1 次。 "c" 出现 3 次。 "cc" 出现 2 次。 "ccc" 出现 1次。 3 + 1 + 2 + 1 + 3 + 2 + 1 = 13示例 2: 输入:s = "xy" 输出:2 解释:同构子字符串是 "x" 和 "y" 。思路方法一:暴力解法:遍历整个字符串,每一次遍历到不同的字符我们将前面的切除掉,然后计算当前字符串得分,得分规则设当前字符重复n次,得分为递增求和公式temp+temp*(temp 1)/2,超时原因是字符串切割次数过多。(超时)方法二:改进简单模拟:遍历整个字符串,每一次迭代我们不进行字符串的切分,使用一个变量来记录当前对比的字符即可,对于一个字符的重复了n次那么其贡献值为n*(n+1)/2,然后我们再跳到下一个不同的字符,并跟新对比的字符以及出现次数。代码class Solution {
public:
int countHomogenous(string s) {
int n=s.size();
if(n==1)
return 1;
if(n==0)
return 0;
int ans=0;
for(int i=0;i<n;)
{
if(i==n)
break;
int temp=helper(s);
if(temp==1)
{
ans++;
i++;
}
else
{
ans+=temp+temp*(temp 1)/2;
i+=temp;
}
s=s.substr(temp);
}
return ans;
}
int helper(string s)
{
char Compare=s[0];
int res=1;
int n=s.size();
if(n==1)
return 1;
for(int i=1;i<n;i++)
{
if(s[i]==Compare)
res++;
else
return res;
}
return res;
}
};class Solution {
public:
int countHomogenous(string s) {
long long MOD = 1000000007;
int n=s.size();
if(n==1)
return 1;
if(n==0)
return 0;
int ans=0;
char prev=s[0];
int temp=1;
for(int i=1;i<n;i++)
{
if(i==n)
break;
//int temp=helper(s);
if(prev==s[i])
{
temp++;
}
else{
prev=s[i];
ans+=(temp + 1) * temp / 2;
temp=1;
}
//s=s.substr(temp);
}
ans+=(long)(long)(temp + 1) * temp / 2%MOD;
return ans%MOD;
}
收获多观察才能知道自己哪里需要改进
wy的leetcode刷题记录_Day62——二叉树结束
分类:
Code
简介:wy的leetcode刷题记录_Day62声明本文章的所有题目信息都来源于leetcode如有侵权请联系我删掉!时间:2022 12 27前言@TOC1750. 删除字符串两端相同字符后的最短长度今天的每日一题是:1750. 删除字符串两端相同字符后的最短长度题目介绍给你一个只包含字符 'a','b' 和 'c' 的字符串 s ,你可以执行下面这个操作(5 个步骤)任意次:选择字符串 s 一个 非空 的前缀,这个前缀的所有字符都相同。选择字符串 s 一个 非空 的后缀,这个后缀的所有字符都相同。前缀和后缀在字符串中任意位置都不能有交集。前缀和后缀包含的所有字符都要相同。同时删除前缀和后缀。请你返回对字符串 s 执行上面操作任意次以后(可能 0 次),能得到的 最短长度 。示例 1: 输入:s = "ca" 输出:2 解释:你没法删除任何一个字符,所以字符串长度仍然保持不变。示例 2: 输入:s = "cabaabac" 输出:0 解释:最优操作序列为:选择前缀 "c" 和后缀 "c" 并删除它们,得到 s = "abaaba" 。选择前缀 "a" 和后缀 "a" 并删除它们,得到 s = "baab" 。选择前缀 "b" 和后缀 "b" 并删除它们,得到 s = "aa" 。选择前缀 "a" 和后缀 "a" 并删除它们,得到 s = "" 。思路简单模拟法:采用双指针,分别从字符串的头部和尾部开始遍历,对于每一次迭代我们的目标就是消除当前迭代的前缀和后缀,于是每一个迭代我们执行:从当前头部指针i寻找需要判别的字符判断头指针和尾指针字符是否相等,若相等继续,否则直接返回当前长度寻找前后缀及长度在寻找后缀时需要判断是否前后缀有重复的字符最后当我们的头指针或者尾指针不相等亦或者字符串遍历完比时,我们返回原字符串长度 执行操作的字符串长度即为答案。代码class Solution {
public:
int minimumLength(string s) {
int n=s.size();
int i=0;
int j=n 1;
int ans=0;
while(i<j)
{
if(s[i]!=s[j])
break;
char Compare=s[i];
//找前缀
while(Compare==s[i])
{
// if(i<j)
// break;
i++;
ans++;
}
//找后缀
while(Compare==s[j])
{
if(i>=j)
break;
j ;
ans++;
}
}
return n ans;
}
};收获简单的模拟题108. 将有序数组转换为二叉搜索树108. 将有序数组转换为二叉搜索树题目介绍给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。示例 1:输入:nums = [ 10, 3,0,5,9] 输出:[0, 3,9, 10,null,5]解释:[0, 10,5,null, 3,null,9] 也将被视为正确答案:示例 2:输入:nums = [1,3] 输出:[3,1]解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。思路很正常的将有序数组的中间作为当前迭代的根节点左区间为左子树,右区间为右子树。代码class Solution {
private:
TreeNode* traversal(vector<int>& nums, int left, int right) {
if (left > right)
return nullptr;
int mid = left + ((right left) / 2);
TreeNode* root = new TreeNode(nums[mid]);
root >left = traversal(nums, left, mid 1);
root >right = traversal(nums, mid + 1, right);
return root;
}
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
TreeNode* root = traversal(nums, 0, nums.size() 1);
return root;
}
};收获二叉树刷的时间段有点长中间忘了很多期待二刷