3月26日题目

关于图的知识

3月26日题目_第1张图片

力扣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月26日题目_第2张图片

 问题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;

    }
};

你可能感兴趣的:(c++,c语言,leetcode,算法,dfs)