LeetCode-【数学】数学在解题中的技巧

1. 不使用变量交换两个数

交换两个数

# 异或
a ^ b = c
c ^ b = a
a ^ c = b
numbers[0] ^= numbers[1];
numbers[1] ^= numbers[0];
numbers[0] ^= numbers[1];

# 加减
A = A+B
B = A-B
A = A-B
numbers[1]=numbers[0]+numbers[1];
numbers[0]=numbers[1]-numbers[0];
numbers[1]=numbers[1]-numbers[0];

2.位运算巧妙题解

136. 只出现一次的数字1

(此题解利用了异或的性质)

def singleNumber(self, nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    res = 0
    for i in nums:
        res^=i
    return res

137. 只出现一次的数字 II

(此题解跳出了题目本身,可以推广到在多个重复n次的数字中找到唯一出现一次的数)

int singleNumber(vector& nums) {
        int value=0;
        for(int i=0;i<32;i++)
        {
            int sum=0;
            for(int j=0;j>i)&1)
                {
                    sum+=1;
                }
            }
            value+=((sum%3)<

260. 只出现一次的数字 III

(此题解的核心在于分组,因为相同元素,在所有bit位是一致的,而不同的数字,必然有某一个bit位存在差异,而找到所有值异或结果后(即可获取存在差异的bit位位置),只需根据存在差异的那一个bit位,将两个不同的数字分到不同的组,即可求出结果。)

vector singleNumber(vector& nums) {
        vector t(2,0);
        int value_xor=nums[0]^nums[1];
        for(int i=2;i>i)&1)
            {
                index=i;
                break;
            }
        }
        for(int i=0;i>index)&1)
            {
                t[0]^=nums[i];
            }
            else
            {
                t[1]^=nums[i];
            }
        }
        return t; 
    }

3.求最大值

面试题 16.07. 最大数值

int(((a+b)+abs(a-b))/2)

4.快速幂

面试题16. 数值的整数次方

原理如下:

    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        if x==0:
            return 0
        res = 1
        if n<0:
            x,n = 1/x,-n
        #x=3,n=6
        #n=6(0x110),res=1,x=3*3 -> n=3,x=9
        # n=3(0x11),res=9,x=9*9 -> n=1,x=81
        #  n=1(0x1),res=729,x=81*81 -> n=0,x=6561
        while n>0:
            if n&1==1:
                res*=x
            x*=x
            n/=2
        return res

 

你可能感兴趣的:(LeetCode)