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";
    }
}
相关推荐
科研前沿37 分钟前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨38 分钟前
1931. 用三种不同颜色为网格涂色
算法·leetcode
晨曦夜月1 小时前
map与unordered_map区别
算法·哈希算法
Morwit1 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
图码1 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler012 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
minglie12 小时前
实数列的常用递推模式
算法
代码小书生2 小时前
math,一个基础的 Python 库!
人工智能·python·算法
AI科技星2 小时前
全域数学·数术本源·高维代数卷(72分册)【乖乖数学】
人工智能·算法·数学建模·数据挖掘·量子计算
生成论实验室2 小时前
《事件关系阴阳博弈动力学:识势应势之道》第一篇:生成正在发生——从《即事经》到事件-关系网络
人工智能·科技·算法·架构·创业创新