leetcode原题: 最小值、最大数字

题目1:最小值

给定两个整数数组ab,计算具有最小差绝对值的一对数值(每个数组中取一个值),并返回该对数值的差

示例:

输入:{1, 3, 15, 11, 2}, {23, 127, 235, 19, 8}
输出:3,即数值对(11, 8)

 解题思路:

1.先对两个数组a和b进行升序排序

2.使用双指针,分别用来遍历两个数组

3.将两个指针所指的数值进行比较,将数值较小的向后移,不断缩小差值

4.直到循环结束,在这过程中,如果遇到两个数值相等,那么说明已经找到最小差值0了,不用继续找下去了。

Code:

class Solution {
public:
    int smallestDifference(vector& a, vector& b) {
        sort(a.begin(), a.end());
        sort(b.begin(), b.end());

        int pa = 0;  //a数组的下标
        int pb = 0;  //b数组的下标
        int na = a.size();  // a的长度
        int nb = b.size();  // b的长度
        long long minres = LLONG_MAX;  //保存最小差值

        while (pa < na && pb < nb) {
            // 更新最小差值
            minres = min(abs((long long)a[pa] - (long long)b[pb]), minres);
            
            // 数值较小的指针往后移,逐渐缩小差值
            if (a[pa] < b[pb]) {
                pa++;
            }
            else if (a[pa] > b[pb]) {
                pb++;
            }
            else {  // 若找到相等的两个数,直接返回最小差值0即可
                return 0;
            }
        }

        return (int)minres;
    }
};

题目2:最大数字

编写一个方法,找出两个数字ab中最大的那一个。不得使用if-else或其他比较运算符。

示例:

输入: a = 1, b = 2
输出: 2

解题思路:

因为题目要求不允许使用比较运算符以及if-else判断语句,所以我们不能直接进行比大小

数学公式上看,我们可以通过公式,计算出较大值:

leetcode原题: 最小值、最大数字_第1张图片

Code:

class Solution {
public:
    int maximum(int a, int b) {
        //为了防止溢出,先将两个int类型的整数转成long long
        long c=a;
        long d=b;
        int res=(int)((fabs(c-d)+c+d)/2);
        return res;
    }
};

 还有一种方式使用 移位+处理溢出

如果是负数,右移32位,结果为-1

 a < b:
 1 + (a - b) >> 31 == 0
 a > b:
 1 + (a - b) >> 31 == 1

Code:

class Solution {
public:
    int maximum(int a, int b) {
        long c = a, d = b;
        //注意这里是long,所以不是右移32位,而是64位
        int k = 1 + ((c - d) >> 63);
        return k * a + (!k) * b;
    }
};

你可能感兴趣的:(leetcode,算法,职场和发展,c++)