美文网首页
常用算法

常用算法

作者: BzCoder | 来源:发表于2021-10-04 16:51 被阅读0次

    快速幂 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;
        }
    

    相关文章

      网友评论

          本文标题:常用算法

          本文链接:https://www.haomeiwen.com/subject/ypninltx.html