首页 > 其他分享 >52.哀家要长脑子了!

52.哀家要长脑子了!

时间:2024-10-28 22:49:19浏览次数:3  
标签:p1 nums int needle 52 哀家 要长 haystack dp

1.75. 颜色分类 - 力扣(LeetCode)

 方法一

把0 和 1排好剩下的2就不用管了。

p0记录下一个0放置的位置,p1记录下一个1放置的位置。所以p0 肯定一直是要小于等于p1的。当遍历到1的时候,放到此时1应该放的位置,即跟p1指针指向的位置交换。当遍历到0的时候,将0放到此时0可以放的位置,如果此时p0小于p1说明什么,说明之前已经处理好0 和 1了,最后一个0后接着就是1,现在交换过后肯定就把一个1给换到后面去了,所以要额外操作一次换回来。

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int p0 = 0, p1 = 0;
        for(int i = 0; i < nums.size(); i++){
            if(nums[i] == 1)
                swap(nums[i], nums[p1++]);
            else if(nums[i] == 0){
                swap(nums[i], nums[p0]);
                
                if(p0 < p1)
                    swap(nums[i], nums[p1]);
                
                p0++, p1++;
            }
        }
        return;
    }
};
方法二

指针a指向0应该放置的位置,指针b指向2应该放置的位置。用一个while把所有的2都放到它们应该放的位置上。放在前面的就是0

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int a = 0, b = nums.size()-1;
        for(int i = 0 ; i <= b; i++){
            while(i <= b && nums[i] == 2){
                swap(nums[i], nums[b--]);
            }
            if(nums[i] == 0) 
                swap(nums[i], nums[a++]);
        }
    }
};
2.28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)

BF算法

从haystack的每一位开始匹配看能不能成功匹配needle,那么每次就要从needle的第一位开始进行模拟,所以每次进行循环都要对a,b指针进行赋值。

class Solution {
public:
    int strStr(string haystack, string needle) {
        int n = haystack.size(), m = needle.size();
        for(int i = 0; i < n; i ++){
            int a = i, b = 0;
            while(b < m && haystack[a] == needle[b])
                a++, b++;
            if(b == m) 
                return a - b;    
//          if(haystack[a] != needle[b])
//              b = 0;
        }
        return -1;
    }
};
 KMP算法
class Solution {
public:
    int strStr(string haystack, string needle) {
        int n = haystack.size(), m = needle.size();
       
        haystack.insert(haystack.begin(), ' ');
        needle.insert(needle.begin(), ' ');

        vector<int> next(m+1);
        for(int i = 2, j = 0; i <= m; i++){
            while(j && needle[i] != needle[j+1]) 
                j = next[j];
            if(needle[i] == needle[j+1])
                j++;
            next[i] = j;
        }

        for(int i = 1, j = 0; i <= n; i++){
            while(j && haystack[i] != needle[j+1])
                j  = next[j];
            if(haystack[i] == needle[j+1])
                j++;
            if(j == m)
                return i - j;
        }
        return -1;
    }
};
3.416. 分割等和子集 - 力扣(LeetCode)

 分割两个子集使得两个子集得元素和相等。可以判断

1.如果给出数组nums的长度小于2,那肯定是不能分成两个子集的

2.如果nums的元素总和是个奇数,肯定是不能被2整除,两个子集的元素和不可能相等

3.分成的两个子集各自的元素和都要等于nums元素总和的一半,如果最大的元素值还要小于这个一半,那肯定也是不行的

用动态规划做,定义dp数组,dp[i][j]代表着:前 i 个元素是否存在一个子集 其元素之和等于 j

初始化:

dp[i][0]:对于前i个元素,其目标之和等于0,那么是存在这样的子集的。空集

dp[0][nums[0]]:如果只考虑前0个元素即元素nums[0],当其目标总和为nums[0]时也是存在这样的子集满足要求,即nums[0]

class Solution {
public:
    bool canPartition(vector<int> &nums) {
        int n = nums.size();
        
        int sum = accumulate(nums.begin(), nums.end(), 0);
        int maxNum = *max_element(nums.begin(), nums.end());
        int target = sum / 2;
        
        if(n < 2 || (sum&1) || maxNum > target)
            return false;

        vector<vector<int>> dp(n, vector<int>(target+1, 0));
        for(int i = 0; i < n; i++)
            dp[i][0] = true;
        dp[0][nums[0]]  = true;

        for(int i = 1; i < n; i++){
            int num = nums[i];
            for(int j = 1; j <= target; j++){
                if(j >= num)
                    dp[i][j] = dp[i-1][j] || dp[i-1][j-num];
                else
                    dp[i][i] = dp[i-1][j];
            }
        }
        return dp[n-1][target];
    }
};

标签:p1,nums,int,needle,52,哀家,要长,haystack,dp
From: https://blog.csdn.net/m0_73072282/article/details/143252891

相关文章

  • 低功耗4G模组:Air780EP开发板RC522实例
    ​本文讲解合宙Air780EP开发板RC522实例,文末【阅读原文】获取最新资料。本文档适用于Air780EP开发板关联文档和使用工具LuatOS-Soc固件获取https://gitee.com/openLuat/LuatOS/releasesrc522-rc522非接触式读写卡驱动-LuatOS文档Luatools下载调试工具一......
  • 【代码随想录Day52】图论Part04
    字符串接龙题目链接/文章讲解:代码随想录importjava.util.*;publicclassMain{//使用广度优先搜索(BFS)方法计算从beginWord到endWord的最短转换序列长度publicstaticintfindLadderLength(StringbeginWord,StringendWord,List<String>wordList){......
  • redis第152节答疑 redis源码分析String重要总结
    redis的string类型,如果数字大于10000,就不去共享整数中去取,然后就变成了embstr或者raw,为什么不是new一个redisobject,并且编码为int对于Redis的字符串类型(String),当字符串表示的是一个整数值时,Redis会根据具体情况选择不同的编码方式。对于数字大于10000的情况,Redis不会将其编......
  • 2024CS 525 All SectionsProgramming
    AdvancedDatabaseOrganization-Fall2024CS525-AllSectionsProgrammingAssignmentIII:RecordManagerDue:Friday,October18th2024by23h59TaskThegoalofthisassignmentistoimplementasimplerecordmanager.Therecordmanagerhandlestablesw......
  • Springboot计算机毕业设计弹唱教学分享平台u0252
    Springboot计算机毕业设计弹唱教学分享平台本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:用户,乐谱分类,乐谱信息,课程分类,课程信息,课程购买开题报告内容进度安排:1、2024.12.20-2025.1.1:选题......
  • E71 树形DP+二分 P3523 [POI2011] DYN-Dynamite
    视频链接:   P3523[POI2011]DYN-Dynamite-洛谷|计算机科学教育新生态//树形DP+二分O(nlogn)#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;intread(){intx=0,f=1;charc=getchar();while(c>'9'||c......
  • [题解]P4552 [Poetize6] IncDec Sequence
    P4552[Poetize6]IncDecSequence我们对\(a\)做差分,得到数组\(b\)。\(a\)的区间修改,等价于选定\(i,j\in[1,n+1]\),令\(b[i]\leftarrow(b[i]+1),b[j]\leftarrow(b[j]-1)\),我们的目标是让\(b[2\simn]\)全为\(0\)。记\(x,y\)分别表示\(b[2\simn]\)中正数之和、负数的绝对值之和......
  • 全面解读icudt52.dll丢失:专家视角下的Unicode与国际化恢复方案
    icudt52.dll是ICU(InternationalComponentsforUnicode)库的一部分,它提供了Unicode字符集和相关国际化功能的支持。当这个DLL文件丢失时,依赖于ICU库的应用程序可能无法正确显示和处理Unicode字符,从而导致国际化功能失效。以下是从专家视角出发,对icudt52.dll丢失问题的全面解读......
  • 嵌套元素的“事件”冒泡?!——WEB开发系列52
    事件处理是创建交互式用户界面的关键部分,浏览器通过事件系统让我们能够捕获和响应用户的输入,比如点击、鼠标移动、键盘输入等。什么是事件冒泡?事件冒泡是指在嵌套的HTML元素中,一个事件从最具体的元素开始,然后向上传播到更高层级的父元素。例如,如果用户点击一个嵌套的按钮,事件首先......
  • M68LC302CAF20VCT,MMC2107CFCPU33,MC9S12UF32PUM,S9S12DJ12F1MPVEMCF52235CVM60MAC7121MA
    NXPSemiconductors公司的产品和技术还广泛应用于安全和身份验证领域,包括智能卡、支付系统、身份识别和生物识别技术。此外,该公司还在电源管理、射频技术和传感器领域拥有丰富的经验和专业知识。恩智浦的产品不仅提供高性能和创新的解决方案,还致力于保证产品的安全性。NXPSem......