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";
    }
}
相关推荐
Coder-magician11 分钟前
图论总结篇
算法·图论
有同事要进步17 分钟前
Leecode第68题:x的平方根
java·数据结构·算法
吹什么轩23 分钟前
linux系统复习:进程优先级与O(1)调度
java·linux·算法
开开心心就好34 分钟前
安卓PDF处理工具,免费无广告零弹窗
android·服务器·开发语言·算法·pdf·ocr
zyl76516 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖20 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌20 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
ychqsq21 小时前
234.无题
经验分享·职场和发展
OPEN-F21 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_3077791321 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab