动态规划,典型最大礼物数
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++]; } }