Java-算法初始台地-打卡20230430

写一半丢了MAD

1.遇到HashMap 扩容导致Npe

设置初始的容量为0,put进去一条数据就开始扩容。并发get到的值为null

2.算法复杂度O表示上限,但是不严格

3.递归性能不一定好,计算递归时间复杂度需要注意

3.1 计算x的n次方,时间复杂度由O(n) - O(logn)

private static int pown (int x, int n) {
        if (n == 0) {
            return 1;
        }
        if (n == 1) {
            return x;
        }
        return x * pown(x, n-1);
    }
    private static int powNLog (int x, int n) {
        if (n == 0) {
            return 1;
        }
        if (n == 1) {
            return x;
        }
        int t = powNLog(x, n/2);
        if (n %2 == 1) {
            return t * t * x;
        }
        return t * t;
    }
    public static void main(String[] args) {
        System.out.println(powNLog(2,20));
        System.out.println(pown(2,20));
    }

3.2 计算斐波那契队列,由O(n^2) -> O(n)


    public static void main(String[] args) {

        System.out.println(fibonaci(20));
        System.out.println(fibonaciOn(1,1, 20));
        System.out.println(fibonaciOnNotRecursion(20));
    }

    private static int fibonaci (int n) {
        if (n == 0) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }
        if (n == 2) {
            return 1;
        }
        return fibonaci(n-1) + fibonaci(n -2);
    }

    private static int fibonaciOn (int first, int second, int n) {
        if (n == 0) {
            return 0;
        }
        if (n < 3) {
            return 1;
        }
        if (n == 3) {
            return first + second;
        }
        return fibonaciOn(second, first + second, n -1);
    }

    private static int fibonaciOnNotRecursion(int n) {
        if (n == 0) {
            return 0;
        }
        if (n < 3) {
            return 1;
        }
        int first = 1, second = 1;
        for(int i = 3; i < n; i++) {
            int term = second;
            second = first + second;
            first = term;
        }
        return first +second;
    }

4 手写了快排,但是看了解释用双指针效果更好点

 public static void main(String[] args) {
        int[] nums = new int[]{2,3,4,1,3,2,45,6,7,89,0,242};
        sortTwoPoint(nums);
        System.out.println(nums);
    }

    private static void sort(int [] nums) {
        if (nums == null) {
            return;
        }
        if (nums.length <= 1) {
            return;
        }

        quickSort(nums, 0, nums.length -1);

    }

    private static void sortTwoPoint(int [] nums) {
        if (nums == null) {
            return;
        }
        if (nums.length <= 1) {
            return;
        }

        quickSortTwoPoint(nums, 0, nums.length -1);

    }

    private static void quickSort(int[] nums, int low, int max) {
        if (max <= low) {
            return;
        }
        int term = nums[low];
        int idx = low;
        for (int i = low +1; i<= max; i++) {
            if (nums[i] < term) {
                transfer(nums, i, idx);
                if(nums[i] < nums[idx + 1]){
                    transfer(nums, i, idx + 1);
                    idx = idx + 1;
                }else {
                    idx = i;
                }
            }
        }
        quickSort(nums, 0, max-1);
        quickSort(nums, idx+1, max);
    }

    private static void quickSortTwoPoint(int[] nums, int low, int max) {
        if (max <= low) {
            return;
        }
        int term = nums[low];
        int p = low + 1, q = max;
        while (p < q) {
            while (p < q && nums[p] < term) {
                p++;
            }
            while (p < q && nums[q] > term) {
                q--;
            }
            transfer(nums, p, q);
        }
        transfer(nums, low, p);
        quickSort(nums, 0, p-1);
        quickSort(nums, p+1, max);
    }

    private static void transfer(int [] nums, int m, int n) {
        int term = nums[m];
        nums[m] = nums[n];
        nums[n] = term;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值