拼多多 最大乘积
题意:从数字数组中选择三个数,使其乘积结果最大。
约束:时间复杂度O(n) 空间复杂度O(1)
解题:三个数的最大乘积为最大的三个数,或者最小的两个负数及最大正数的乘积。所以找到这五个数就好
# python3 30ms 4088K
n = int(input())
ary = [_ for _ in map(int, input().strip('\n').split())]
v = [0] * 5
for val in ary:
if val >= v[2]:
val, v[2] = v[2], val
if v[2] >= v[3]:
v[2], v[3] = v[3], v[2]
if v[3] >= v[4]:
v[3], v[4] = v[4], v[3]
if val <= v[1]:
val, v[1] = v[1], val
if v[1] <= v[0]:
v[1], v[0] = v[0], v[1]
print(max(v[0] * v[1] * v[4], v[2] * v[3] * v[4]))
大整数相乘
两个大数相乘,手写10000进制,或者利用傅里叶变换
#include <cstdio>
#include <cstring>
const int N = 1010, BASE = 10000;
char a[N], b[N];
int bit[N >> 1], eax[N >> 1], res[N >> 1];
void add(int EAX[], int len, int phase) {
for (int i = phase, j = 0; j < len; ++j, ++i) {
res[i] += EAX[j];
if (res[i] >= BASE) {
res[i] -= BASE;
res[i + 1]++;
}
}
}
int main()
{
for (int i = 0; i < 4; ++i) a[i] = b[i] = '0';
while (~scanf("%s%s", a + 4, b + 4)) {
memset(bit, 0, sizeof bit);
memset(res, 0, sizeof res);
int len_a = strlen(a), len_b = strlen(b), i, len = 0, phase = 0;
int guard = len_a % 4; if (guard == 0) guard = 4;
for (i = len_a - 1; i > guard; i -= 4) {
for (int j = 0, k = i - 3; j < 4; ++j, ++k)
bit[len] = bit[len] * 10 + a[k] - '0';
len++;
}
guard = len_b % 4; if (guard == 0) guard = 4;
for (i = len_b - 1; i > guard; i -= 4, ++phase) { //phase 相位移
int num = 0, c = 0, j;
for (int j = 0, k = i - 3; j < 4; ++j, ++k) {
num = num * 10 + b[k] - '0';
}
for (j = 0; j < len; ++j) {
eax[j] = bit[j] * num + c; c = 0;
if (eax[j] >= BASE) {
c = eax[j] / BASE;
eax[j] %= BASE;
}
}
if (c) eax[j++] = c;
add(eax, j, phase); // res += eax;
}
i = (len_a + len_b - 8 >> 2) + ((len_a + len_b - 8) % 4 > 0);
while (i > 1 && res[i - 1] == 0) --i;
printf("%d", res[--i]);
while (i-- > 0) printf("%04d", res[i]);
puts("");
}
return 0;
}
变态跳台阶 斐波那契 动态规划
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
f n = ∑ i = [ 0 , n ) f i f_n=\sum_{i=[0,n)}f_i fn=∑i=[0,n)fi
public class Solution {
public int JumpFloorII(int target) {
int[] dp = new int[target + 1];
dp[0] = dp[1] = 1;
for (int i = 2; i <= target; ++i) {
dp[i] = 0;
for (int j = 0; j < i; ++j) {
dp[i] += dp[j];
}
}
return dp[target];
}
}