0
点赞
收藏
分享

微信扫一扫

01_公式篇

钟罗敏 2022-04-15 阅读 48
算法

算法零基础五十题讲解

剑指 Offer 64. 求1+2+…+n

int sumNums(int n){
    !n || (n+=sumNums(n-1));
    return n;
}

面试题 08.05. 递归乘法

乘法变为累加
class Solution {
    public int multiply(int A, int B) {
        if(A == 0 || B == 0){
            return 0;
        }
        return A + multiply(A,B-1);
    }
}
累加+移位,相比上面更快
int multiply(int A, int B){
    if(A<B)
    A^=B^=A^=B;
    if(B==1)
    return A;
    if((B&1)==0)
    return multiply(A,B>>1)<<1;
    else
    return A+(multiply(A,B>>1)<<1);
}

509. 斐波那契数

滑动窗口
int fib(int n){
    if(n>=0 && n<2)
    return n;
    int p=0,q=0,r=1;
    for(int i=2 ; i<=n ; ++i){
        p=q;
        q=r;
        r=p+q;
    }
    return r;
}

1492. n 的第 k 个因子

int kthFactor(int n, int k){
    int count = 0;
    for(int i = 1; i<= n; ++i){
        if(n % i == 0){
            count ++;
            if(count == k){
                return i;
            }
        }
    }
    return -1;
}

[1,√n]上n的因子,正序,和[√n,1]上n的因子,逆序,对应的数相乘总是等于n

class Solution {
    public int kthFactor(int n, int k) {
        int mid = (int)(Math.sqrt(n));
        int count = 0;
        int[] arr = new int[mid];
        for(int i= 1; i <= mid; ++i){
            if(n % i == 0){
                arr[count++] = i;
                if(count == k)
                    return i;
            }
        }    //从[1,√n]
        for(int i= count-1; i>= 0; --i){
            if(n / arr[i] == arr[i]){    //考虑arr[i]*arr[i]==n,那么arr[i]这个因子就跳过,不再重复计数
                --i;
            }
            ++count;
            if(k == count){
                return n / arr[i];
            }
        }    //从[√n,1]
        return -1;
    }
}

1925. 统计平方和三元组的数目

class Solution {
    public int countTriples(int n) {
        int count = 0;
        for(int i = 3; i <= n-2; ++i){
            for(int j = i + 1; j <= n-1; ++j){
                for(int k = j + 1; (k < (i + j)) && (k <= n) ; ++k){
                    if(i * i + j * j == k * k){
                        count ++;
                        break;
                    }
                }
            }
        }
        count *= 2;
        return count;
    }
}

1979. 找出数组的最大公约数

class Solution {
    public int findGCD(int[] nums) {
        int max = nums[0], min = nums[0];
        for(int i = 0; i < nums.length; ++i){
            max = max >= nums[i] ? max : nums[i];
            min = min <= nums[i] ? min : ![image-20220415232032541](C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20220415232032541.png)[i];
        }
        for(int i = min; i >= 1; --i){
            if((max % i == 0) && (min % i == 0))
            return i;
        }
        return 0;
    }
}

812. 最大三角形面积

在这里插入图片描述

class Solution {
    public double largestTriangleArea(int[][] points) {
        double maxArea = 0, area;
        for(int i = 0; i < points.length; ++i){
            for(int j = 0; j < points.length; ++j){
                for(int k = 0; k < points.length; ++k){
                    area = Math.abs((points[j][0] - points[i][0]) * (points[k][1] - points[i][1]) - (points[k][0] - points[i][0]) * (points[j][1] - points[i][1])) / 2.0;
                    if(maxArea < area)
                    maxArea = area;
                }
            }
        }
        return maxArea;
    }
}
三阶行列式求三角形面积

点乘是向量的内积 叉乘是向量的外积。

点乘,也叫数量积。结果是一个向量在另一个向量方向上投影的长度,是一个标量。

叉乘,也叫向量积。结果是一个和已有两个向量都垂直的向量。

混合积

官方题解
class Solution {
    public double largestTriangleArea(int[][] points) {
        int N = points.length;
        double ans = 0;
        for (int i = 0; i < N; ++i)
            for (int j = i+1; j < N; ++j)
                for (int k = j+1; k < N; ++k)
                    ans = Math.max(ans, area(points[i], points[j], points[k]));
        return ans;
    }

    public double area(int[] P, int[] Q, int[] R) {
        return 0.5 * Math.abs(P[0]*Q[1] + Q[0]*R[1] + R[0]*P[1]
                             -P[1]*Q[0] - Q[1]*R[0] - R[1]*P[0]);
    }
}

1716. 计算力扣银行的钱

class Solution {
    public int totalMoney(int n) {
        int k  = n / 7;
        int ans = 0;
        for(int i = 1; i <= k; ++i){
            ans += (2*i + 6) * 7 / 2;
        }
        if(n % 7 != 0){
            for(int i = 1; i <= (n % 7); ++i){
                ans += k+i;
            }
        }
        return ans;
    }
}
举报

相关推荐

0 条评论