diff --git a/Leecode/src/main/java/com/markilue/leecode/hot100/interviewHot/dynamic/LC_312_MaxCoins.java b/Leecode/src/main/java/com/markilue/leecode/hot100/interviewHot/dynamic/LC_312_MaxCoins.java new file mode 100644 index 0000000..8be1a8e --- /dev/null +++ b/Leecode/src/main/java/com/markilue/leecode/hot100/interviewHot/dynamic/LC_312_MaxCoins.java @@ -0,0 +1,12 @@ +package com.markilue.leecode.hot100.interviewHot.dynamic; + +/** + *@BelongsProject: Leecode + *@BelongsPackage: com.markilue.leecode.hot100.interviewHot.dynamic + *@Author: markilue + *@CreateTime: 2023-06-01 11:50 + *@Description: TODO 力扣312 戳气球 + *@Version: 1.0 + */ +public class LC_312_MaxCoins { +} diff --git a/Leecode/src/main/java/com/markilue/leecode/hot100/interviewHot/graph/LC_207_CanFinish.java b/Leecode/src/main/java/com/markilue/leecode/hot100/interviewHot/graph/LC_207_CanFinish.java index c169400..3c70fb8 100644 --- a/Leecode/src/main/java/com/markilue/leecode/hot100/interviewHot/graph/LC_207_CanFinish.java +++ b/Leecode/src/main/java/com/markilue/leecode/hot100/interviewHot/graph/LC_207_CanFinish.java @@ -1,5 +1,7 @@ package com.markilue.leecode.hot100.interviewHot.graph; +import org.junit.Test; + import java.util.ArrayList; import java.util.List; @@ -13,6 +15,13 @@ import java.util.List; */ public class LC_207_CanFinish { + @Test + public void test() { + int numCourses = 2; + int[][] prerequisites = {{1, 0}}; + System.out.println(canFinish1(numCourses, prerequisites)); + } + List> edge;//边 //本质上就是图的深度优先搜索:检测这个图是否存在环路 @@ -29,4 +38,52 @@ public class LC_207_CanFinish { return false; } + + + boolean valid = true; + + public boolean canFinish1(int numCourses, int[][] prerequisites) { + + //构建图 + List> edge = new ArrayList<>(); + for (int i = 0; i < numCourses; i++) { + edge.add(new ArrayList<>()); + } + + for (int[] prerequisite : prerequisites) { + edge.get(prerequisite[0]).add(prerequisite[1]); + } + + int[] used = new int[edge.size()]; + + + for (int i = 0; i < edge.size() && valid; i++) { + if (used[i] == 0) { + dfs(edge, i, used); + } + + } + return valid; + + } + + private void dfs(List> edge, int i, int[] used) { + used[i] = 1; + List curList = edge.get(i); + + for (Integer next : curList) { + if (used[next] == 1) { + //正在用,不行 + valid = false; + return; + } else if (used[next] == 0) { + dfs(edge, next, used); + if (!valid) { + return; + } + } + } + used[i] = 2; + } + } diff --git a/Leecode/src/main/java/com/markilue/leecode/hot100/second/T78_300_LengthOfLIS.java b/Leecode/src/main/java/com/markilue/leecode/hot100/second/T78_300_LengthOfLIS.java index 5139c2b..b02218f 100644 --- a/Leecode/src/main/java/com/markilue/leecode/hot100/second/T78_300_LengthOfLIS.java +++ b/Leecode/src/main/java/com/markilue/leecode/hot100/second/T78_300_LengthOfLIS.java @@ -45,6 +45,32 @@ public class T78_300_LengthOfLIS { } } - return index+1; + return index + 1; + } + + + //使用一个单调数组记录,如果比最大的一个小就找一个合适的位置进行替换,而不影响原来的长度 + public int lengthOfLIS1(int[] nums) { + + int[] stack = new int[nums.length]; + stack[0] = nums[0]; + int index = 0; + + for (int i = 1; i < nums.length; i++) { + if (nums[i] > stack[index]) { + //单调递增,顺利加入 + stack[++index] = nums[i]; + } else { + //需要找一个合适的位置加入 + for (int j = 0; j <= index; j++) { + if (nums[i] < stack[j]) { + stack[j] = nums[i]; + break; + } + } + } + } + return index + 1;//返回的是长度 + } } diff --git a/Leecode/src/main/java/com/markilue/leecode/hot100/second/T79_301_RemoveInvalidParentheses.java b/Leecode/src/main/java/com/markilue/leecode/hot100/second/T79_301_RemoveInvalidParentheses.java index 3909df0..00f3860 100644 --- a/Leecode/src/main/java/com/markilue/leecode/hot100/second/T79_301_RemoveInvalidParentheses.java +++ b/Leecode/src/main/java/com/markilue/leecode/hot100/second/T79_301_RemoveInvalidParentheses.java @@ -18,7 +18,7 @@ public class T79_301_RemoveInvalidParentheses { @Test public void test() { String s = "(a)())()"; - System.out.println(removeInvalidParentheses(s)); + System.out.println(removeInvalidParentheses1(s)); } @@ -40,13 +40,13 @@ public class T79_301_RemoveInvalidParentheses { } } List result = new ArrayList<>(); - removeHelper(s, left, right, result,0); + removeHelper(s, left, right, result, 0); return result; } //需要注意这个start;一定要从这个字母后面开始删除 - public void removeHelper(String s, int left, int right, List res,int start) { + public void removeHelper(String s, int left, int right, List res, int start) { if (left == 0 && right == 0) { if (isValid(s)) { res.add(new String(s)); @@ -61,10 +61,10 @@ public class T79_301_RemoveInvalidParentheses { return; } if (left > 0 && s.charAt(i) == '(') { - removeHelper(s.substring(0, i) + s.substring(i + 1), left - 1, right, res,i); + removeHelper(s.substring(0, i) + s.substring(i + 1), left - 1, right, res, i); } if (right > 0 && s.charAt(i) == ')') { - removeHelper(s.substring(0, i) + s.substring(i + 1), left, right - 1, res,i); + removeHelper(s.substring(0, i) + s.substring(i + 1), left, right - 1, res, i); } } @@ -84,4 +84,54 @@ public class T79_301_RemoveInvalidParentheses { } + //朴素的想法:删除无效的括号,本质上就是要判断怎么样的是无效,然后将无效的部分删除并判断合不合适即可 + public List removeInvalidParentheses1(String s) { + int left = 0; + int right = 0; + + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) == '(') { + left++; + } else if (s.charAt(i) == ')') { + if (left > 0) { + left--; + } else { + right++; + } + + } + } + //判断完之后就需要进行删除;同时,不可能存在left,right都大于0的情况 + List result = new ArrayList<>(); + remove(s, left, right, result,0); + return result; + } + + public void remove(String s, int left, int right, List res,int start) { + if (left == 0 && right == 0) { + if (isValid(s)) { + res.add(s); + } + return; + } + + //必须在删除的后面继续删才可以 + for (int i = start; i < s.length(); i++) { + //去重 + if(i>start&&s.charAt(i)==s.charAt(i-1))continue; + //不够了 + if (left + right > s.length() - i) return; + if (left > 0 && s.charAt(i) == '(') { + //可以移除左边 + remove(s.substring(0, i) + s.substring(i + 1), left - 1, right, res,i); + } + + if (right > 0 && s.charAt(i) == ')') { + //可以移除左边 + remove(s.substring(0, i) + s.substring(i + 1), left, right - 1, res,i); + } + } + } + + } diff --git a/Leecode/src/main/java/com/markilue/leecode/hot100/second/T81_312_MaxCoins.java b/Leecode/src/main/java/com/markilue/leecode/hot100/second/T81_312_MaxCoins.java new file mode 100644 index 0000000..2cd9177 --- /dev/null +++ b/Leecode/src/main/java/com/markilue/leecode/hot100/second/T81_312_MaxCoins.java @@ -0,0 +1,65 @@ +package com.markilue.leecode.hot100.second; + +import org.junit.Test; + +import java.util.Arrays; + +/** + *@BelongsProject: Leecode + *@BelongsPackage: com.markilue.leecode.hot100.second + *@Author: markilue + *@CreateTime: 2023-06-01 11:13 + *@Description: TODO 力扣312 戳气球 + *@Version: 1.0 + */ +public class T81_312_MaxCoins { + + @Test + public void test() { + int[] nums ={3,1,5,8}; + System.out.println(maxCoins(nums)); + } + + + int[][] memo; + + //朴素的想法:判断那一步是最大值,为了节省时间需要将值记录下来 + //考虑到区间的方式,这里可以使用二维数组来记录 + public int maxCoins(int[] nums) { + int n = nums.length; + //构造一个完整数组 + int[] newNums = new int[n + 2]; + + for (int i = 1; i <= n; i++) { + newNums[i] = nums[i - 1]; + } + newNums[0] = newNums[n + 1] = 1; + + //初始化记忆搜索矩阵 + memo = new int[n + 2][n + 2]; + for (int[] ints : memo) { + Arrays.fill(ints, -1); + } + //开始状态转移 + return dp(newNums, 0, n + 1); + + } + + //判断left和right为区间的最大值 + public int dp(int[] nums, int left, int right) { + if (left + 1 >= right) {//区间小于三个值 + return 0; + } + if (memo[left][right] != -1) {//记忆过了 + return memo[left][right]; + } + + //挨个找left和right区间类戳破气球的最大值;i表示最后戳谁 + for (int i = left + 1; i < right; i++) {//只能戳中间,不能戳两边 + int sum = nums[left] * nums[i] * nums[right]; + sum += dp(nums, left, i) + dp(nums, i, right);//把左边的和右边的都添加上 + memo[left][right] = Math.max(memo[left][right], sum); + } + return memo[left][right]; + } +} diff --git a/Leecode/src/main/java/com/markilue/leecode/hot100/second/T82_322_CoinChange.java b/Leecode/src/main/java/com/markilue/leecode/hot100/second/T82_322_CoinChange.java new file mode 100644 index 0000000..5c1b8d1 --- /dev/null +++ b/Leecode/src/main/java/com/markilue/leecode/hot100/second/T82_322_CoinChange.java @@ -0,0 +1,76 @@ +package com.markilue.leecode.hot100.second; + +import org.junit.Test; + +import java.util.Arrays; + +/** + *@BelongsProject: Leecode + *@BelongsPackage: com.markilue.leecode.hot100.second + *@Author: markilue + *@CreateTime: 2023-06-01 11:55 + *@Description: TODO 力扣322 零钱兑换 + *@Version: 1.0 + */ +public class T82_322_CoinChange { + + @Test + public void test() { + int[] coins = {5, 2, 1}; + int amount = 11; + System.out.println(coinChange(coins, amount)); + } + + @Test + public void test1() { + int[] coins = {186, 419, 83, 408}; + int amount = 6249; + System.out.println(coinChange(coins, amount)); + } + + public int coinChange(int[] coins, int amount) { + + int[][] dp = new int[coins.length][amount + 1];//dp[i][j]表示 使用coin[0-i]装满amount最小要多少个硬币 + Arrays.sort(coins); + for (int i = 1; i < dp[0].length; i++) { + dp[0][i] = i % coins[0] == 0 ? i / coins[0] : Integer.MAX_VALUE; + } + + for (int i = 1; i < coins.length; i++) { + for (int j = 1; j < amount + 1; j++) { + if (j >= coins[i] && dp[i][j - coins[i]] != Integer.MAX_VALUE) { + dp[i][j] = Math.min(dp[i][j - coins[i]] + 1, dp[i - 1][j]);//用当前的硬币;不用当前的硬币 + } else { + dp[i][j] = dp[i - 1][j]; + } + + } + } + + return dp[coins.length - 1][amount] == Integer.MAX_VALUE ? -1 : dp[coins.length - 1][amount]; + + + } + + + //滚动数组优化: + public int coinChange1(int[] coins, int amount) { + + int[] dp = new int[amount + 1];//dp[i][j]表示 使用coin[0-i]装满amount最小要多少个硬币 + Arrays.sort(coins); + for (int i = 1; i < dp.length; i++) { + dp[i] = i % coins[0] == 0 ? i / coins[0] : Integer.MAX_VALUE; + } + + for (int i = 1; i < coins.length; i++) { + for (int j = coins[i]; j < amount + 1; j++) { + if (dp[j - coins[i]] != Integer.MAX_VALUE) { + dp[j] = Math.min(dp[j - coins[i]] + 1, dp[j]);//用当前的硬币;不用当前的硬币 + } + } + } + + return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount]; + + } +} diff --git a/Leecode/src/main/java/com/markilue/leecode/interview/huawei/Question1.java b/Leecode/src/main/java/com/markilue/leecode/interview/huawei/Question1.java new file mode 100644 index 0000000..53c7d5e --- /dev/null +++ b/Leecode/src/main/java/com/markilue/leecode/interview/huawei/Question1.java @@ -0,0 +1,65 @@ +package com.markilue.leecode.interview.huawei; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.PriorityQueue; +import java.util.Scanner; + +/** + *@BelongsProject: Leecode + *@BelongsPackage: com.markilue.leecode.interview.huawei + *@Author: markilue + *@CreateTime: 2023-05-31 19:09 + *@Description: TODO + *@Version: 1.0 + */ +public class Question1 { + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + + } + + @Test + public void test() { + int[][] nums = { + {1, 5}, + {6, 3}, + {2, 2}, + {5, 4}, + {1, 6}, + }; + solve(3, nums); + } + + public void solve(int max, int[][] nums) { + + PriorityQueue queue = new PriorityQueue<>(new Comparator() { + @Override + public int compare(Integer o1, Integer o2) { + return o1-o2; + } + }); + for (int[] num : nums) { + StringBuilder sb = new StringBuilder(); + int A = num[0]; + int B = num[1]; + for (int i = 0; i < A; i++) { + if (queue.size() < max) { + queue.offer(B); + } else if (queue.peek() < B) { + queue.poll(); + queue.offer(B); + } + } + Integer[] n = queue.toArray(new Integer[0]); + Arrays.sort(n); + for (int i = n.length - 1; i >= 0; i--) { + sb.append(n[i]); + } + System.out.println(sb); + } + } +} diff --git a/Leecode/src/main/java/com/markilue/leecode/interview/huawei/Question2.java b/Leecode/src/main/java/com/markilue/leecode/interview/huawei/Question2.java new file mode 100644 index 0000000..d0816f1 --- /dev/null +++ b/Leecode/src/main/java/com/markilue/leecode/interview/huawei/Question2.java @@ -0,0 +1,51 @@ +package com.markilue.leecode.interview.huawei; + +import org.junit.Test; + +import java.util.Arrays; + +/** + *@BelongsProject: Leecode + *@BelongsPackage: com.markilue.leecode.interview.huawei + *@Author: markilue + *@CreateTime: 2023-05-31 19:47 + *@Description: TODO + *@Version: 1.0 + */ +public class Question2 { + + public void solve(int m, int n) { + + } + + int[][] memo; + + @Test + public void test() { + int m = 13; + int n = 11; + memo = new int[m + 1][n + 1]; + for (int[] ints : memo) { + Arrays.fill(ints, -1); + } + + int result = find(m, n); + System.out.println(result); + } + + public int find(int m, int n) { + if (m < n) return find(n, m); + if (memo[m][n] != -1) return memo[m][n]; + if (m == 0 || n == 0) { + memo[m][n] = 0; + return 0; + } + + int result = Integer.MAX_VALUE; + for (int i = n; i >= 1; i--) { + result = Math.min(result, 1 + find(m - i, n) + find(n - i, m)); + } + memo[m][n] = result; + return result; + } +} diff --git a/phm_rotate/backend/phm_backend/service/service_data_interface/src/main/java/com/cqu/dataInterface/entity/GasTypeState.java b/phm_rotate/backend/phm_backend/service/service_data_interface/src/main/java/com/cqu/dataInterface/entity/GasTypeState.java index 3ff6ad0..7e6d84f 100644 --- a/phm_rotate/backend/phm_backend/service/service_data_interface/src/main/java/com/cqu/dataInterface/entity/GasTypeState.java +++ b/phm_rotate/backend/phm_backend/service/service_data_interface/src/main/java/com/cqu/dataInterface/entity/GasTypeState.java @@ -17,26 +17,26 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class GasTypeState { - String stt; - String edt; - String type_id; - Long rated_temp; - Long rated_press; - Long rated_flow_rate; - Long rated_speed; - Long rated_power; - Long rated_load; - Long rated_duration; - Double avg_LubeReturnT2; - Double avg_T5TC1; - Double avg_GFFlow; - Double avg_LFFlow; - Double avg_NHP_1; - Double avg_AirInletDP_1; - Double avg_T1_1; - Double avg_LubeHaderP; - Double avg_LubeFilterDP; - Double avg_TankT; - Double avg_GrBxAccel; - Long ts; + private String stt; + private String edt; + private String type_id; + private Long rated_temp; + private Long rated_press; + private Long rated_flow_rate; + private Long rated_speed; + private Long rated_power; + private Long rated_load; + private Long rated_duration; + private Double avg_LubeReturnT2; + private Double avg_T5TC1; + private Double avg_GFFlow; + private Double avg_LFFlow; + private Double avg_NHP_1; + private Double avg_AirInletDP_1; + private Double avg_T1_1; + private Double avg_LubeHaderP; + private Double avg_T5TC9; + private Double avg_TankT; + private Double avg_LFT; + private Long ts; } diff --git a/phm_rotate/backend/phm_backend/warehouse/rt-warehouse/src/main/java/com/cqu/warehouse/realtime/app/dws/GasTypeStateApp.java b/phm_rotate/backend/phm_backend/warehouse/rt-warehouse/src/main/java/com/cqu/warehouse/realtime/app/dws/GasTypeStateApp.java index 444e25e..f6d92ce 100644 --- a/phm_rotate/backend/phm_backend/warehouse/rt-warehouse/src/main/java/com/cqu/warehouse/realtime/app/dws/GasTypeStateApp.java +++ b/phm_rotate/backend/phm_backend/warehouse/rt-warehouse/src/main/java/com/cqu/warehouse/realtime/app/dws/GasTypeStateApp.java @@ -60,7 +60,7 @@ public class GasTypeStateApp extends BaseStreamApp { " LFT DOUBLE, " + " realtime STRING, " + " row_time as TO_TIMESTAMP(SUBSTRING(realtime from 0 for 19), 'yyyy-MM-dd HH:mm:ss'), " + - " WATERMARK FOR row_time as row_time - INTERVAL '5' SECOND" + + " WATERMARK FOR row_time as row_time - INTERVAL '1' SECOND" + ") " + "with(" + MyKafkaUtils.getKafkaSourceByDDL(topic, groupId) + ")"; @@ -106,7 +106,7 @@ public class GasTypeStateApp extends BaseStreamApp { Table table = tableEnv.sqlQuery(selectSQL); // tableEnv.executeSql(selectSQL).print(); DataStream windowDS = tableEnv.toAppendStream(table, GasTypeState.class); - windowDS.print(">>>"); + windowDS.print(">>>");//很久没打印可能是正常的,大概会慢10多个分钟的窗口,暂时不知道为什么 windowDS.addSink( ClickhouseUtils.getJDBCSink("insert into gas_type_state values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)") diff --git a/phm_rotate/backend/phm_backend/warehouse/rt-warehouse/src/main/java/com/cqu/warehouse/realtime/app/dws/clickhouseTable.sql b/phm_rotate/backend/phm_backend/warehouse/rt-warehouse/src/main/java/com/cqu/warehouse/realtime/app/dws/clickhouseTable.sql index 51daf92..7cdd887 100644 --- a/phm_rotate/backend/phm_backend/warehouse/rt-warehouse/src/main/java/com/cqu/warehouse/realtime/app/dws/clickhouseTable.sql +++ b/phm_rotate/backend/phm_backend/warehouse/rt-warehouse/src/main/java/com/cqu/warehouse/realtime/app/dws/clickhouseTable.sql @@ -87,9 +87,9 @@ create table gas_type_state avg_AirInletDP_1 Decimal64(3), avg_T1_1 Decimal64(3), avg_LubeHaderP Decimal64(3), - avg_LubeFilterDP Decimal64(3), + avg_T5TC9 Decimal64(3), avg_TankT Decimal64(3), - avg_GrBxAccel Decimal64(3), + avg_LFT Decimal64(3), ts UInt64 ) engine = ReplacingMergeTree(ts) partition by toYYYYMMDD(stt) diff --git a/phm_rotate/backend/phm_backend/warehouse/rt-warehouse/src/main/java/com/cqu/warehouse/realtime/utils/ClickhouseUtils.java b/phm_rotate/backend/phm_backend/warehouse/rt-warehouse/src/main/java/com/cqu/warehouse/realtime/utils/ClickhouseUtils.java index de6bb02..b44d147 100644 --- a/phm_rotate/backend/phm_backend/warehouse/rt-warehouse/src/main/java/com/cqu/warehouse/realtime/utils/ClickhouseUtils.java +++ b/phm_rotate/backend/phm_backend/warehouse/rt-warehouse/src/main/java/com/cqu/warehouse/realtime/utils/ClickhouseUtils.java @@ -51,7 +51,7 @@ public class ClickhouseUtils { new JdbcExecutionOptions.Builder() // .withMaxRetries(3) // .withBatchIntervalMs() - .withBatchSize(1)//每5次输出到clickhouse + .withBatchSize(5)//每5次输出到clickhouse .build(), new JdbcConnectionOptions.JdbcConnectionOptionsBuilder() .withDriverName("ru.yandex.clickhouse.ClickHouseDriver")