关于图的知识
力扣2139 得到目标值的最小行动次数
int minMoves(int target, int maxDoubles){
int c=0;
while(maxDoubles&&target!=1)//这里是俩个判断条件。不可以少,要考虑全。
{
if(target%2==1)//任何数的二倍一定是偶数,所以我如果当前状态如果是奇数就只可能-1
{
target-=1;
c++;
}
else//否则就是说是奇数,按照贪心算法,肯定是越大的数倍数更大,所以我是反着的
{
target/=2;
c++;
maxDoubles--;//变换次数也要减
}
}
if(target==1)
return c;
else
{
return c=c+target-1;//这里你要减一,因为自己本身不需要算变的情况
//就比如5 0 ,返回应该是4,如果不减1就是错误的
}
}
考的算是半个思维吧,没想到居然ac了,第一次自己不看题解做出来的思维题目。
力扣周赛
做了俩道题目。
现在有些普通难度的题目也有思路了(名为普通其实也是简单题目)
附上代码
第一题目
给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 answer ,其中:
answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。
answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组成的列表。
注意:列表中的整数可以按 任意 顺序返回。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-difference-of-two-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
vector> findDifference(vector& nums1, vector& nums2) {
vector> a;vectorb;vectorc;
unordered_set p,q,k,l;
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
int n = nums1.size(),m = nums2.size();
for(int i = 0;i
这题思路其实很简单,就是用桶,主要这里可以难倒用C语言的玩家吧,C语言开辟空间真的好难啊,我c++也不是很好,也需要熟悉多去看,去百度
第二题
int minDeletion(int* nums, int numsSize){
if(numsSize==0)
return 0;
int c=0;
int f=0;
for(int i=0;i
思路大概就是这样子,希望自己可以保持下去吧。至少每次比赛,保底2道题目吧qwq,后面再加油学
接着第三题(比赛的时候脑子只有暴力)
看了别人的代码茅塞顿开
贴一位大佬的代码
5253. 找到指定长度的回文数
给你一个整数数组 queries
和一个 正 整数 intLength
,请你返回一个数组 answer
,其中 answer[i]
是长度为 intLength
的 正回文数 中第 queries[i]
小的数字,如果不存在这样的回文数,则为 -1
。
回文数 指的是从前往后和从后往前读一模一样的数字。回文数不能有前导 0 。
class Solution {
public:
long long expen(long long num,long long intLength)
{
int len=(intLength+1)/2;//继续分开
vectorres(intLength,0);//问题4?先将容器初始化,这里为什么要初始化么
for(int i=0;i kthPalindrome(vector& queries, int intLength) {
int n=(intLength+1)/2;//先将数分开,分成俩半,
//问题1?为什么这里要+1呢
vectorres;//定义一个容器
for(auto q: queries)
{
long long start=(long long) pow(10,n-1);//问题2?我这个是什么意思呢
if(q>start*9)//问题3?我为什么要乘以9呢
else
res.push_back(expen(start+q-1,intLength));//问题3?调用,我为什么要这么调用呢?
//res.push_back(expen(start+q-1, intLength));
}
return res;
}
};
你是不是看着这个代码看的一头雾水呢?敲了我也是,
但是我走了一下流程,就将我可以解答的就解答吧(可能不正确),剩下的不会阿,就等你帮我了
问题1:3,4位的回文数,都是90,他们是一样的
问题2?正好对应了问题1,如图理解
问题3:大概大家不理解 res.push_back(expen(start+q-1,intLength));这个语句吧,现在你有着问题2的图式,你可能会根据图式找到答案了,发现规律,比如说案例给我的
[2,4,6], intLength = 4
[1111,1331,1551]
就是相当于取2的时候就是11,取3的时候就是12(其实我也不好解释,数学归纳法??、)
问题4:这个我需要大佬帮我,呜呜呜,个人是觉得越界了
问题5:他就是以中间划分,依次往外面跑,就如12,他的2是在数组中间,1在数组后面
关于dfs的事情
17. 电话号码的字母组合
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。(力扣)
感谢评论大佬
class Solution {
vectorres;
string tmp;
vectorboard={"","","abc","def","ghi","jkl","mno", "pqrs","tuv","wxyz"};
//每一个数字对应有哪些字母
void dfs(int pos,string digits)
{
if(pos==digits.size())//就是说我的digits里面的做完了,我就进字符串数组
{
res.push_back(tmp);
return ;
}
int num=digits[pos]-'0';//就是digits里面的数字,去对映board里面的值
//就可以从里面遍历
for(int i=0;i letterCombinations(string digits) {
if(digits.size()==0)
{
return res;//如果没有值,我就返回一个空字符串数组
}
dfs(0,digits);
return res;
}
};