最大礼物数

动态规划,典型最大礼物数

public static void main1() {
        int num[][] = new int[][]{
                {1, 3, 6, 8, 9},
                {1, 6, 1, 3, 0},
                {2, 6, 5, 4, 1},
        };

        int rows = num.length;
        int cols = num[0].length;

        int dp[][] = new int[rows][cols];
        dp[0][0] = num[0][0];

        for (int i = 1; i < cols; i++) {
            dp[0][i] = dp[0][i - 1] + num[0][i];
        }
        for (int i = 1; i < rows; i++) {
            dp[i][0] = dp[i - 1][0] + num[i][0];
        }

        for (int i = 1; i < rows; i++) {
            for (int j = 1; j < cols; j++) {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + num[i][j];
            }
        }

        System.out.println(dp[rows-1][cols-1]);
    }

 最大字符串长度

public static void main2() {
        String rou_chuan = "abcabcdbb";

        char ary[] = rou_chuan.toCharArray();

        Map<Character, Integer> map = new HashMap();
        map.put(ary[0], 0);
        int maxLength = 1;
        int li = 0;
        for (int i = 1; i < ary.length; i++) {
            char currChar = ary[i];
            int pi = map.getOrDefault(currChar, -1);

            if (pi >= li) {
                li = pi + 1;
            }

            map.put(currChar, i);
            if ((i - li + 1) > maxLength) {
                maxLength = i - li + 1;
            }
        }

        System.out.println(maxLength);
    }

 冒泡排序,对有序数组的优化

int a[] = {99, 1, 2, 55, 6, 199, 3, 10, -1};
        for (int j = 0; j < a.length; j++) {
            int index = a.length;
            for (int i = 1; i < a.length - j; i++) {
                if (a[i] < a[i - 1]) {
                    int tmp = 0;
                    tmp = a[i];
                    a[i] = a[i - 1];
                    a[i - 1] = tmp;
                    index = a.length - i - 1;
                }
            }
            j = index;
        }

 归并排序,时间复杂度nlogn

public static void splitter(int data[], int beginIdx, int endIdx) {
        if (beginIdx >= endIdx) return;

        int middleIdx = (beginIdx + endIdx) >> 1;
        splitter(data, beginIdx, middleIdx);
        splitter(data, middleIdx + 1, endIdx);
        merge(data, beginIdx, middleIdx, endIdx);
    }

    private static void merge(int[] data, int beginIdx, int middleIdx, int endIdx) {
        int[] tmp = new int[endIdx - beginIdx + 1];
        int leftIdx = beginIdx;
        int rightIdx = middleIdx + 1;
        int tmpIdx = 0;
        for (; leftIdx <= middleIdx && rightIdx <= endIdx; ) {
            int leftItem = data[leftIdx];
            int rightItem = data[rightIdx];
            if (leftItem >= rightItem) {
                tmp[tmpIdx] = rightItem;
                rightIdx++;
            } else if (leftItem < rightItem) {
                tmp[tmpIdx] = leftItem;
                leftIdx++;
            }
            tmpIdx++;
        }

        for (; leftIdx <= middleIdx; ) {
            tmp[tmpIdx] = data[leftIdx];
            tmpIdx++;
            leftIdx++;
        }

        for (; rightIdx <= endIdx; ) {
            tmp[tmpIdx] = data[rightIdx];
            tmpIdx++;
            rightIdx++;
        }

        tmpIdx = 0;
        for (int i = beginIdx; i <= endIdx; i++) {
            data[i] = tmp[tmpIdx++];
        }
    }

 

posted @ 2020-05-26 16:50  soft.push("zzq")  Views(143)  Comments(0Edit  收藏  举报