673. 最长递增子序列的个数
给定一个未排序的整数数组,找到最长递增子序列的个数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
import java.util.ArrayList;
import java.util.List;
class Solution {
    /**
     * 查询第一个i,使得 data.get(i).get(data.get(i).size() - 1) >= target
     *
     * @param data
     * @param n
     * @param target
     * @return
     */
    private static int search1(List<List<Integer>> data, int n, int target) {
        int l = 0, r = n - 1;
        while (l <= r) {
            int mid = (l + r) >> 1;
            if (data.get(mid).get(data.get(mid).size() - 1) < target) {
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        return l;
    }
    /**
     * 查询第一个i,使得data.get(i) < target
     *
     * @param data
     * @param n
     * @param target
     * @return
     */
    private static int search2(List<Integer> data, int n, int target) {
        int l = 0, r = n - 1;
        while (l <= r) {
            int mid = (l + r) >> 1;
            if (data.get(mid) >= target) {
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        return l;
    }
    public static int findNumberOfLIS(int[] nums) {
        List<List<Integer>> dp = new ArrayList<>();
        List<List<Integer>> count = new ArrayList<>();
        for (int num : nums) {
            int index = search1(dp, dp.size(), num);
            int cnt = 1;
            if (index > 0) {
                int k = search2(dp.get(index - 1), dp.get(index - 1).size(), num);
                cnt = count.get(index - 1).get(count.get(index - 1).size() - 1) - (k == 0 ? 0 : count.get(index - 1).get(k - 1));
            }
            if (index == dp.size()) {
                List<Integer> dpItem = new ArrayList<>();
                dpItem.add(num);
                dp.add(dpItem);
                List<Integer> countItem = new ArrayList<>();
                countItem.add(cnt);
                count.add(countItem);
            } else {
                dp.get(index).add(num);
                cnt += count.get(index).get(count.get(index).size() - 1);
                count.get(index).add(cnt);
            }
        }
        return count.get(count.size() - 1).get(count.get(count.size() - 1).size() - 1);
    }
}
    心之所向,素履以往 生如逆旅,一苇以航

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号