牛客網演算法——名企高頻面試題143題(8)
阿新 • • 發佈:2020-12-17
題目描述
請寫出一個高效的在m*n矩陣中判斷目標值是否存在的演算法,矩陣具有如下特徵:
每一行的數字都從左到右排序
每一行的第一個數字都比上一行最後一個數字大
例如:
對於下面的矩陣:
package 名企高頻面試題143; import java.util.Arrays; /** * @Classname 矩陣查詢 * @Description TODO * @Date 2020/12/16 10:57 * @Created by xjl */ public class 矩陣查詢 { /** * @description TODO 主要是的使用的二分查詢的演算法 * @param: matrix * @param: target * @date: 2020/12/16 11:02 * @return: boolean * @author: xjl */ public boolean searchMatrix(int[][] matrix, int target) { if (matrix.length == 0) return false; for (int[] arr : matrix) { //採用的是的陣列的二分查詢 int index = Arrays.binarySearch(arr, target); if (index >= 0) { return true; } } return false; } }
題目描述
給出一組候選數C 和一個目標數T,找出候選數中起來和等於T 的所有組合。 C 中的每個數字在一個組合中只能使用一次。
注意:
- 題目中所有的數字(包括目標數T\ TT )都是正整數
- 組合中的數字 (a1,a2,…,aka_1, a_2, … , a_ka1,a2,…,ak) 要按非遞增排序 (a1≤a2≤…≤aka_1 \leq a_2 \leq … \leq a_ka1≤a2≤…≤ak).
- 結果中不能包含重複的組合
- 組合之間的排序按照索引從小到大依次比較,小的排在前面,如果索引相同的情況下數值相同,則比較下一個索引。
package 名企高頻面試題143; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; /** * @Classname 目標值的和 * @Description TODO * @Date 2020/12/16 10:55 * @Created by xjl */ public class 目標值的和 { @Test public void test() { ArrayList<ArrayList<Integer>> ans = combinationSum3(new int[]{100, 10, 20, 70, 60, 10, 50}, 80); for (ArrayList<Integer> lists : ans) { for (int i : lists) { System.out.print(i + " "); } System.out.println(); } } /** * @description TODO * @param: num * @param: target * @date: 2020/12/16 10:55 * @return: java.util.ArrayList<java.util.ArrayList < java.lang.Integer>> * @author: xjl */ ArrayList<ArrayList<Integer>> ans = new ArrayList<>(); public ArrayList<ArrayList<Integer>> combinationSum3(int[] num, int target) { ArrayList<Integer> list = new ArrayList<>(); boolean[] vis = new boolean[num.length]; Arrays.sort(num); dfs(num, 0, target, list, vis); return ans; } private void dfs(int[] num, int index, int target, ArrayList<Integer> list, boolean[] vis) { //保證的是剪枝的情況 if (target < 0) { return; } //終止條件 if (target == 0 && !ans.contains(list)) { ans.add(new ArrayList<>(list)); return; } for (int i = index; i < num.length; i++) { if (vis[i] == false) { //這個狀態 list.add(num[i]); vis[i] = true; //下一個轉態 dfs(num, i + 1, target - num[i], list, vis); list.remove(list.size() - 1); vis[i] = false; } } } }
題目描述
給定一個二叉樹和一個值sum,判斷是否有從根節點到葉子節點的節點值之和等於sum 的路徑,