1. 程式人生 > 資訊 >彭博:蘋果正在開發更輕更薄的 MacBook Air,15 英寸版本規劃中

彭博:蘋果正在開發更輕更薄的 MacBook Air,15 英寸版本規劃中

技術標籤:演算法

動態規劃

  • 子陣列的最大累加和 原題

    • 當前數和前一個數的和和當前數比較 取大值作為當前陣列索引的值(小的值沒有價值(因為大者可以替代)放棄)
    • 當前值和之前大者比較 保留大者
    public int maxsumofSubarray (int[] arr) {
        // write code here
        if(arr.length==0||arr==null)
            return 0;
        
        int sum = 0;
        for(int i=1;i<arr.length;i++){
           arr[i] = Math.max(arr[
    i-1]+arr[i],arr[i]); sum = Math.max(sum,arr[i]); } return sum; }
  • 最長公共子串 原題

    • 最後擷取字元需要 長度 最後一次更換最大長度的索引值(需要擷取的最後索引)
    • 最長公共子串的長度儲存 採用變數
    • 節點前最長公共子串的長度儲存 採用二維陣列
    • 邏輯 判斷迴圈當前兩個值是否相等(如果上個索引相等則取出相加否則重新計0)
    • 擷取 返回
    string LCS(string str1, string str2) {
        // write code here
        int m = str1.size();
        int
    n = str2.size(); // dp[i][j] str1前i個字元和str2前j個字元(以其為尾字元)的最長公共子串長度 int dp[m+1][n+1]; int maxlen = 0, end = 0; //base case for(int i = 0; i <= m; ++i) dp[i][0] = 0; for(int j = 0; j <= n; ++j) dp[0][j] = 0; for(int i = 1; i <= m; ++i) { for(int j = 1; j <= n; ++j) {
    if(str1[i-1] == str2[j-1]) dp[i][j] = dp[i-1][j-1] + 1; else dp[i][j] = 0; if(dp[i][j] > maxlen) { maxlen = dp[i][j]; end = j - 1; } } } string r; if(res == 0) return "-1"; else r = str2.substr(end-maxlen+1, res); return r; } public static String LCS (String str1, String str2) { // write code here StringBuilder sb = new StringBuilder(); int start = 0, end = 1; while (end < str1.length() + 1) { if (str2.contains(str1.substring(start, end))) { if (sb.length() < end - start) { sb.delete(0, sb.length()); sb.append(str1, start, end); } end++; } else { start++; } } if (sb.length() == 0) { return "-1"; } return sb.toString(); }
  • 字串的排列 link

    • 遞歸回溯法
      • 每個位置可以有後面所有元素依次替換產生新數 會重複 用set儲存 之後可以再排序