Leetcode(一)-数学(一)

本文深入解析了多个经典算法题目,包括最小差值I、自除数、各位相加等,提供了详细的解题思路和代码实现,是算法学习者的宝贵资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

908. 最小差值 I

思路:如果当最大值与最小值之间的差距大于2k的时候,此时最大值与最小值最小差距应该为max_value-k,min_value+k.最终的结果是:res = max_value-min_value-2k。如果当距离小于2k的时候,无论如何都能到0。所以代码比较简单

class Solution {
public:
    int smallestRangeI(vector<int>& A, int K) {
        
        if(A.size()==1||A.size()==0) return 0;
        sort(A.begin(),A.end());
        if(A[A.size()-1]-A[0]>=2*K) return A[A.size()-1]-A[0]-2*K;
        else
            return 0;
        
    }
};

728. 自除数

思路:直接暴力,估计有更好地方法

class Solution {
public:
    bool divid(int num)
    {
        int tmp_value = num;
        while(tmp_value%10)
        {
            if(tmp_value%10==0&&tmp_value/10!=0) return false;
            int divid = tmp_value%10;
            if(num%divid!=0) return false;
            tmp_value/=10;
        }
        if(tmp_value%10==0&&tmp_value/10!=0) return false;
        return true;
    }
    vector<int> selfDividingNumbers(int left, int right) {
        
        vector<int> res;
        for(int i=left;i<=right;i++)
        {
            if(divid(i)) res.push_back(i);
        }
        return res;
    }
};

258. 各位相加

思路:暴力

class Solution {
public:
    int addDigits(int num) {
        
        while(num>=10)
        {
            int sum = 0;
            while(num)
            {
                sum+=num%10;
                num/=10;
            }
            num = sum;
        }
        return num;
    }
};

思路二:a,b,c三个数字组成n=a*100+b*10+c,m=a+b+c,那么m与n相差a*99+b*9,所以m-n=9*(11*a+b)

代码为

class Solution {
public:
    int addDigits(int num) {
        if(num==0) return num;
        int res = num%9;
        if(res>0) return res;
        else return 9;
    }
};

171. Excel表列序号

思路:直接暴力

class Solution {
public:
    int titleToNumber(string s) {
        
        int sum = 0;
        for(int i=0;i<s.length();i++)
        {
            sum=sum*26+(s[i]-'A'+1);
        }
        return sum;
    }
};

13. 罗马数字转整数

思路:直接暴力。。。

class Solution {
public:
    int romanToInt(string s) {
        unordered_map<char,int> map;
        map['I'] = 1;
        map['V'] = 5;
        map['X'] = 10;
        map['L'] = 50;
        map['C'] = 100;
        map['D'] = 500;
        map['M'] = 1000;
        int res = 0;
        for(int i=0;i<s.length();i++)
            res+=map[s[i]];
        for(int i=1;i<s.length();i++)
        {
            if(map[s[i]]>map[s[i-1]])
                res-=2*map[s[i-1]];
        }
        return res;
    }
};

868. 二进制间距

思路:存储每个1的位置,然后求一个最大的位置的点就可以了。

class Solution {
public:
    int binaryGap(int N) {
        
        int ans = 0;
        int last = -1;
        for(int i=0;i<32;i++)
        {
            if (((N >> i) & 1) > 0)
            {
                if(last>=0)
                {
                    ans = max(i-last,ans);
                }
                last = i;
            }
        }
        return ans;
    }
};

507. 完美数

思路:一点小技巧,首先可以优化到(n/2),发现还是超时,然后可以优化到sqrt(n),值得注意的是需要在res不仅仅需要加i,还需要加num/i

class Solution {
public:
    bool checkPerfectNumber(int num) {
        
        int res = 1;
        if(num%2) return false;
        for(int i=2;i*i<=num;i++)
        {
            if(num%i==0) res+=i+num/i;
        }
        return res==num;
    }
};

754. 到达终点数字

class Solution {
public:
    int reachNumber(int target) {
        
        int t = abs(target);
        int step = 0;
        int dist = 0;
        while(dist<t)
        {
            step++;
            dist+=step;
        }
        int dt = dist-t;
        if(dt%2==0) return step;
        else
        {
            if(step%2==0) return step+1;
            else
                return step+2;
        }
    }
};

367. 有效的完全平方数

思路:公式,1+2+3+...(2n-1)= n*n,所以挨个减去奇数,如果为0就是完全平方数

class Solution {
public:
    bool isPerfectSquare(int num) {
        
        int i = 1;
        while(num>0)
        {
            num-=i;
            i+=2;
        }
        return num==0;
    }
};

思路:二分

231. 2的幂

思路:神仙题,做过一次就会了吧。

263. 丑数

思路:暴力

class Solution {
public:
    bool isUgly(int num) {
        
        if(num<=1) return num==1;
        while(num%2==0) num/=2;
        while(num%3==0) num/=3;
        while(num%5==0) num/=5;
        return num==1;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值