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";
    }
}
相关推荐
孞㐑¥6 分钟前
算法—滑动窗口
开发语言·c++·经验分享·笔记·算法
历程里程碑10 分钟前
Linux 3 指令(3):进阶指令:文件查看、资源管理、搜索打包压缩详解
linux·运维·服务器·c语言·数据结构·笔记·算法
咋吃都不胖lyh24 分钟前
GBDT 中的前向分布算法和贪婪学习
学习·算法
leo__52027 分钟前
CLEAN算法仿真程序,用于雷达信号中的杂波抑制
算法
一分之二~38 分钟前
二叉树--求最小深度(迭代和递归)
数据结构·c++·算法·leetcode·深度优先
老鼠只爱大米39 分钟前
LeetCode经典算法面试题 #24:两两交换链表中的节点(迭代法、递归法等多种实现方案详细解析)
算法·leetcode·链表·递归·双指针·迭代·链表交换
mjhcsp40 分钟前
挑战训练一个 AlphaZero 五子棋
算法·洛谷
Word码1 小时前
leetcode260.只出现一次的数字III
算法
MM_MS1 小时前
Halcon图像采集助手、ROI操作和画图、ROI实现区域与轮廓之间的相互转换、区域的交集差集取反
图像处理·人工智能·数码相机·算法·目标检测·计算机视觉·视觉检测
智者知已应修善业1 小时前
【输出一个N*N的01矩阵,表示最后的汉字点阵图】2024-10-22
c语言·数据结构·c++·经验分享·笔记·算法·矩阵