1. 程式人生 > 其它 >牛客網演算法——名企高頻面試題143題(8)

牛客網演算法——名企高頻面試題143題(8)

技術標籤:牛客網題目資料結構與演算法演算法

題目描述

請寫出一個高效的在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 的路徑,