leetcode29——Divide Two Integers

题目大意:在不使用*、/、%这三种符号的情况下,算出商(dividend/divisor)

分析:数学思路考察。不让用除号可以考虑加减法,当dividend大于divisor的时候,dividend就可以减去一个divisor,最后的答案就是能减去divisor的个数,但是这种循环会超时,效率太低。所以我们考虑用移位这个符号,左移一位相当于乘2,左移n位就是乘2^n,大大缩减了减法的次数。最终结果就是divisor的所有系数相加,也就是为了左移所乘的乘数相加。dividend=divisor2n1+divisor2n2+...+divisor2n

代码:转载自https://www.cnblogs.com/songlee/p/5738037.html

class Solution {
public:
    int divide(int dividend, int divisor) {
        bool positive = true;                // 表示结果的正负
        if((dividend>0 && divisor<0) || (dividend<0 && divisor>0))
            positive = false;
        long long absDividend = abs((long long)dividend);
        long long absDivisor = abs((long long)divisor);
        long long result = 0;
        while(absDivisor <= absDividend) {
            long long tmp = absDivisor;
            long long count = 1;
            while((tmp<<1) <= absDividend) {
                tmp = tmp<<1;                // divisor*2^n,divisor左移一直移到最接近dividend并且小于dividend
                count = count<<1;            // count = 2^n
            }
            result += count;                 // 系数累加
            absDividend -= tmp;
        }
        if(positive && result >= INT_MAX)
            return INT_MAX;
        return positive ? result:-result;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
给定一个整数数组 nums 和一个目标值 target,要求在数组中找出两个数的和等于目标值,并返回这两个数的索引。 思路1:暴力法 最简单的思路是使用两层循环遍历数组的所有组合,判断两个数的和是否等于目标值。如果等于目标值,则返回这两个数的索引。 此方法的时间复杂度为O(n^2),空间复杂度为O(1)。 思路2:哈希表 为了优化时间复杂度,可以使用哈希表来存储数组中的元素和对应的索引。遍历数组,对于每个元素nums[i],我们可以通过计算target - nums[i]的值,查找哈希表中是否存在这个差值。 如果存在,则说明找到了两个数的和等于目标值,返回它们的索引。如果不存在,将当前元素nums[i]和它的索引存入哈希表中。 此方法的时间复杂度为O(n),空间复杂度为O(n)。 思路3:双指针 如果数组已经排序,可以使用双指针的方法来求解。假设数组从小到大排序,定义左指针left指向数组的第一个元素,右指针right指向数组的最后一个元素。 如果当前两个指针指向的数的和等于目标值,则返回它们的索引。如果和小于目标值,则将左指针右移一位,使得和增大;如果和大于目标值,则将右指针左移一位,使得和减小。 继续移动指针,直到找到两个数的和等于目标值或者左指针超过了右指针。 此方法的时间复杂度为O(nlogn),空间复杂度为O(1)。 以上三种方法都可以解决问题,选择合适的方法取决于具体的应用场景和要求。如果数组规模较小并且不需要考虑额外的空间使用,则暴力法是最简单的方法。如果数组较大或者需要优化时间复杂度,则哈希表或双指针方法更合适。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值