算法零基础五十题讲解
剑指 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 : [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;
}
}