常用算法
2021-10-04 本文已影响0人
BzCoder
快速幂 Fast Power
public int fastPower(int a, int b) {
int ans = 1;
while (b != 0) {
if ((b & 1) != 0) { //如果当前的次幂数最后一位(二进制数)不为0的话,那么我们将当前权值加入到最后答案里面去
ans = ans * base;
}
//权值增加
base = base * base;
b >>= 1;
}
return ans;
}
快速取模 FastMode
// a^b mod c = (a mod c)^b mod c
public int fastMod(int a, int b, int n) {
if (n == 0) {
return 1 % b;
}
long ans = 1l;
long base = a % b;
while (n != 0) {
if ((n & 1) == 1) {
ans = (ans * base) % b;
}
//为了避免超出long的范围,所以取三次模
base = (base % b) * (base % b) % b;
n >>= 1;
}
return (int) ans;
}
快速排序 FastSort
quickSort(arr, 0, arr.length - 1);
private void quickSort(int[] arr, int l, int r) {
// 子数组长度为 1 时终止递归
if (l >= r) return;
// 哨兵划分操作(以 arr[l] 作为基准数)
int i = l, j = r;
while (i < j) {
while (i < j && arr[j] >= arr[l]) j--;
while (i < j && arr[i] <= arr[l]) i++;
swap(arr, i, j);
}
swap(arr, i, l);
// 递归左(右)子数组执行哨兵划分
quickSort(arr, l, i - 1);
quickSort(arr, i + 1, r);
}
private void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
大数加法
List<Integer> check(List<Integer> a, List<Integer> b) {
List<Integer> ans = new ArrayList<>();
int t = 0;
for (int i = 0; i < a.size() || i < b.size(); i++) {
if (i < a.size()) t += a.get(i);
if (i < b.size()) t += b.get(i);
ans.add(t % 10);
t /= 10;
}
if (t > 0) ans.add(t);
return ans;
}
二分法
public static int binary(int[] array, int value)
{
int low = 0;
int high = array.length - 1;
while(low <= high)
{
int middle = (high - low) / 2 + low;
if(value == array[middle])
{
return middle;
}
if(value > array[middle])
{
low = middle + 1;
}
if(value < array[middle])
{
high = middle - 1;
}
}
return -1;
}