leetcode刷题日常

  1. 最长递增子序列
    最长递增子序列
java 复制代码
class Solution {
      public int lengthOfLIS(int[] nums) {
        int n=nums.length;
        if(n==0) return 0;
        int[] dp = new int[n]; // 记录上一个比当前是第几的元素。
        dp[0] = 1;
        int ans = 1;
        for(int i=1;i<n;i++){
            dp[i] =1;
            for(int j=0;j<=i;j++){
                if (nums[j]<nums[i]){
                    dp[i]=Math.max(dp[i],dp[j]+1);
                }
            }
            ans=Math.max(dp[i],ans);
        }
        return ans;
    }


    public int lengthOfLIS1(int[] nums) {
        int n=nums.length;
        if(n==0) return 0;
        int[] dp =new int[n+1]; // dp[i] 是长度为i的递增子序列的末尾的最小值。
        int len = 1; // 当前递增子序列的值。
        dp[len]=nums[0];
        for(int i=1;i<n;i++){
            int cur=nums[i];
            if (cur>dp[len]) {
                dp[len+1]=cur;
                len++;
            }else{
                int pos=0; // 从后向前找
                for(int j=len-1;j>=1;j--){
                    if(dp[j]<cur){
                        pos=j;
                        break;
                    }
                }
                dp[pos+1]=cur;
            }
        }
        return len;
    }

    public int lengthOfLIS2(int[] nums) {
        int len = 1, n = nums.length;
        if (n == 0) {
            return 0;
        }
        int[] d = new int[n + 1];
        d[len] = nums[0];
        for (int i = 1; i < n; ++i) {
            if (nums[i] > d[len]) {
                d[++len] = nums[i];
            } else {
                int l = 1, r = len, pos = 0; // 如果找不到说明所有的数都比 nums[i] 大,此时要更新 d[1],所以这里将 pos 设为 0
                // 对dp原序列进行遍历,将每位元素二分插入 dp 中,如果dp中元素都比它小,将它插到最后。否则,用它覆盖掉比它大的元素中最小的那个。
                while (l <= r) { // 左闭右开,找到比当前元素小的最大元素
                    int mid = (l + r) >> 1;
                    if (d[mid] < nums[i]) {
                        pos = mid;
                        l = mid + 1;
                    } else {
                        r = mid - 1;
                    }
                }
                d[pos + 1] = nums[i];
            }
        }
        return len;
    }

      /**
     * 找到比当前元素大的最小元素
     * @param arr
     * @param cur
     * @return
     */
    public int findBiggerMin(int[] arr,int cur){
        int r=arr.length-1,l=0;
        int ans=-1;
        while(l<=r){
            int mid=(l+r)/2;
            if (arr[mid]>cur){
                ans=mid;
                r=mid-1;
            }else {
                l=mid+1;
            }
        }
        return ans==-1?-1:arr[ans];
    }

    /**
     * 找到比当前元素小的最大元素
     * @param arr
     * @param cur
     * @return
     */
    public int findSmallerMax(int[] arr,int cur){
        int r=arr.length-1,l=0;
        int ans=-1;
        while(l<=r){
            int mid=(l+r)/2;
            if (arr[mid]<cur){
                ans=mid;
                l=mid+1;
            }else {
                r=mid-1;
            }
        }
        return ans==-1?-1:arr[ans];
    }
}
  1. 猜数字游戏
    猜数字游戏
java 复制代码
class Solution {
     /**
     * 299猜数字
     * @param secret
     * @param guess
     * @return
     */
    public String getHint(String secret, String guess) {
        // 记录位置和数字都猜对的个数。
        int a=0,b=0;
        Map<Character,Integer> secretLeft=new HashMap<>();
        Map<Character,Integer> guessLeft=new HashMap<>();
        for(int i=0;i<secret.length();i++){
            if (guess.length()>i&&secret.charAt(i)==guess.charAt(i)){
                a++;
            }else {
                secretLeft.put(secret.charAt(i),secretLeft.getOrDefault(secret.charAt(i),0)+1);
                if (guess.length()>i){
                    guessLeft.put(guess.charAt(i),guessLeft.getOrDefault(guess.charAt(i),0)+1);
                }
            }
        }
        for (Map.Entry<Character, Integer> entry : secretLeft.entrySet()) {
            if (guessLeft.containsKey(entry.getKey())){
                b+=Math.min(guessLeft.get(entry.getKey()),secretLeft.get(entry.getKey()));
            }
        }
        return a+"A"+b+"B";
    }
}
相关推荐
careathers7 分钟前
【数据结构】基于比较的排序算法 - 交换排序
数据结构·算法·排序算法
文丑颜不良啊9 分钟前
LeetCode2081~2100题目解析
java·leetcode
Rabitebla1 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法
tellmewhoisi1 小时前
深度学习0:数学知识:正态分布1
人工智能·深度学习·算法
-梅1 小时前
算法(1) 动态规划
算法·动态规划
青少儿编程课堂2 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:Bellman-Ford与SPFA含负权最短路及负环检测全解析
c++·python·算法·bfs·信息学竞赛
文丑颜不良啊2 小时前
LeetCode2061~2080题目解析
java·leetcode
octopus_c3 小时前
STL 之 string:auto 与范围 for、常用接口、模拟实现与深浅拷贝
开发语言·c++·算法
文丑颜不良啊14 小时前
LeetCode1941~1960题目解析
java·leetcode
MUSHANGXS16 小时前
大模型时代的新蓝海-基于OS底层的AI-Agent应用
人工智能·职场和发展·交互