首页 > 其他分享 >Leetcode 16-20题

Leetcode 16-20题

时间:2024-02-18 17:24:37浏览次数:30  
标签:20 target nums int 16 Leetcode 括号 && 节点

最接近的三数之和

给定整数数组和目标值target,从数组中选出三个整数,使得和与target最接近,并返回三数之和。保证恰好存在一个解。

和上一题类似,我们先对整数数组排序,然后固定i,枚举j,找到满足nums[i]+nums[j]+nums[k]>=target的最小的k

那么显然有nums[i]+nums[j]+nums[k-1]<target,只需要判断两者谁离target最接近即可。

int threeSumClosest(vector<int>& nums, int target) {
    sort(nums.begin(), nums.end());
    int delta = INT_MAX, sum = 0;
    for(int i = 0; i < nums.size() - 2; i ++) {
        if(i && nums[i] == nums[i - 1]) continue;
        for(int j = i + 1, k = nums.size() - 1; j < k; j ++) {
            if(j > i + 1 && nums[j] == nums[j - 1]) continue;
            while(k - 1 > j && nums[i] + nums[j] + nums[k - 1] >= target)   k --;
            // 找到固定i和j时满足三数之和大于等于目标值的k,可以保证i,j,k-1三数之和小于目标值
            int p = nums[i] + nums[j] + nums[k], q = nums[i] + nums[j] + nums[k - 1];
            if(abs(p - target) < delta) delta = abs(p - target), sum = p;
            // k-1不能和k相等
            if(k != j + 1 && abs(q - target) < delta) delta = abs(q - target), sum = q;
        }
    }
    return sum;
}

电话号码的字母组合

数字和字母的映射同电话按键,给定包含数字2-9的字符串,返回能表示的字母组合。

这是一道非常经典的DFS题。每一层只需要枚举这一位填哪个字母,然后到头输出再返回即可。

vector<string> to = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
vector<string> ans;

void dfs(string &digits, int u, string path) {
    if(path.size() == digits.size()) {      // 若字母串和数字串相同长度则得到答案
        ans.push_back(path);
        return ;
    }
    for(auto c : to[digits[u] - '0']) {     // 数字为digits[u] - '0'
        path += c;
        dfs(digits, u + 1, path);           // 迭代判断第u+1个数字
        path.pop_back();                    // 恢复现场
    }
}

vector<string> letterCombinations(string digits) {
    if(!digits.size())  return ans;     // 若空直接返回
    dfs(digits, 0, "");
    return ans;
}

四数之和

给定整数数组和目标值,返回四数之和等于目标值且不重复的所有四元组。

数组长度为\([1,200]\),数的大小为\([-10^9, 10^9]\)。

和三数之和一样,只是多了一重循环而已。

但是这里要注意,可能会爆int,判断的时候要开long long

vector<vector<int>> fourSum(vector<int>& nums, int target) {
    vector<vector<int>> ans;
    sort(nums.begin(), nums.end());
    for(int i = 0; i < nums.size(); i ++) {
        if(i && nums[i] == nums[i - 1]) continue;
        for(int j = i + 1; j < nums.size(); j ++) {
            if(j > i + 1 && nums[j] == nums[j - 1]) continue;
            for(int k = j + 1, l = nums.size() - 1; k < l; k ++) {  // 固定i,j,k
                if(k > j + 1 && nums[k] == nums[k - 1]) continue;
                // 强转为long long来判断
                while(l-1 > k && 0ll + nums[i] + nums[j] + nums[k] + nums[l - 1] >= 1ll * target)  l--;
                if(0ll + nums[i] + nums[j] + nums[k] + nums[l] == target * 1ll)
                    ans.push_back({nums[i], nums[j], nums[k], nums[l]});
            }
        }
    }
    return ans;
}

删除链表的倒数第N个结点

删除链表的倒数第 n 个结点,并且返回链表的头结点。

先扫描一边链表得到链表长度,然后再正着删除这个节点即可。可以使用虚拟头节点来取消对头节点的特判。

删除第k个节点的方法就是将第k-1个节点的next指针指向第k+1个节点。

ListNode* removeNthFromEnd(ListNode* head, int n) {
    ListNode* damn = new ListNode(-1, head);    // 虚拟头节点
    int len = 0;
    for(auto p = head; p; p = p->next)  len ++; // 原链表的长度
    // 1 2 3 4 5
    // len=5,倒数第2个是从实际头节点开始的正数第4个(len-n+1)
    // 倒数第n个节点就是从虚拟头节点开始正数第len - n + 2个节点
    // 那么从虚拟头节点要往后走len-n次才能到实际要删的节点的前面一个节点
    auto p = damn;
    for(int i = 1; i <= len - n; i ++)  p = p->next;
    // 要删第k个节点,就将第k-1个节点的next指针指向第k+1个节点
    p->next = p->next->next;
    return damn->next;
}

有效的括号

给定只包含()[]{}的字符串,判断是否有效。

有效的标准是左右括号必须相邻且匹配。

一道经典的栈题。遇到左括号则入栈,遇到右括号则判断栈顶的左括号和当前右括号是否匹配。

最后判断栈是否为空,若栈不为空则不匹配。

左括号(的ASCII为40, 右括号)的ASCII码为41。

左括号[的ASCII为91, 右括号]的ASCII码为93。

左括号{的ASCII为123, 右括号}的ASCII码为125。

所以只要左括号和右括号的ASCII码的差的绝对值小于等于2,则可以判断匹配。

bool isValid(string s) {
    stack<char> st;
    for(auto c : s) {
        if(c == '(' || c == '[' || c == '{')    st.push(c);
        else {
            // 一定要加abs来判断距离,否则会导致91-123=-32的情况出现
            if(st.size() && abs(c - st.top()) <= 2)  st.pop();
            else    return false;
        }
    }
    return st.empty();
}

标签:20,target,nums,int,16,Leetcode,括号,&&,节点
From: https://www.cnblogs.com/xushengxiang/p/18019613

相关文章

  • 2024-02-18-物联网C语言(6-动态内存申请)
    6.动态内存申请6.1动态分配概述​ 在数组一章中,介绍过数组的长度是预先定义好的,在整个程序中固定不变,但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。​ 为了解决上述问题,C语言提供了-些内存管理函数,这些内存管理函数可以按需......
  • 2024牛客寒假算法基础集训营2
    C.TokitsukazeandMin-MaxXOR题解:01Trie观察后发现对序列\(a\)排序并不影响结果然后容易知道,对于\(i<j,a_i\oplusa_j\leqk\),一共有\(2^{i-j-1}\)种序列\(b\)满足条件,特别的,如果\(i=j\),只有\(1\)种满足条件那么现在问题就转换为,我们固定\(a_......
  • 亚马逊云ec2-user安装node-js-18.16.0
    1,下载vnm管理工具curl-o-https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh|bashexportNVM_DIR="$HOME/.nvm"[-s"$NVM_DIR/nvm.sh"]&&\."$NVM_DIR/nvm.sh"#Thisloadsnvm[-s"$NVM_DIR/bash......
  • Unity 2022.3.20f1新功能,异步实例化预制体Object.InstantiateAsync
    今天查看Unity2022.3.20f1更新日志,发现新增了个异步实例化的功能,这个功能解决了Unity历史上实例化预制体卡顿的痛点,简直不要太爽。具体的API文档请点击跳转。做了个简单的实例化测试,实例化500*500个Cube,耗时9.2s。实例化过程之间不会卡顿,可以做其他事情,即便是在重度游戏加载场......
  • P9847 [ICPC2021 Nanjing R] Crystalfly
    前景导入当\(t\in[1,2]\)时,本题如何求解?答:树形dp设\(f[i]\)为以\(i\)为根的树,根节点的晶蝶已消散且儿子节点的晶蝶还未被惊动,能获得的最大晶蝶数。则有状态转移方程\(f[i]=(\sumf[u])+max(a[u])\),其中\(u\)为\(i\)的儿子。最终的答案即为\(f[1]+a[1]\)划向更......
  • P1149 [NOIP2008 提高组] 火柴棒等式
    [NOIP2008提高组]火柴棒等式题目描述给你\(n\)根火柴棍,你可以拼出多少个形如\(A+B=C\)的等式?等式中的\(A\)、\(B\)、\(C\)是用火柴棍拼出的整数(若该数非零,则最高位不能是\(0\))。用火柴棍拼数字\(0\sim9\)的拼法如图所示:注意:加号与等号各自需要两根火柴棍;如果\(......
  • 2024-02-17-物联网C语言(5-指针)
    5.指针5.1关于内存那点事存储器:外存和内存 外存:长期存放数据,掉电不会丢失数据,如硬盘、光盘、ROM等 内存:暂时存放数据,掉电数据丢失,如RAM,DDR等内存:物理内存和虚拟内存物理内存:实实在在的存储设备虚拟内存:操作系统虚拟出来的内存操作系统会在物理内存和虚拟内存之间做映......
  • [刷题笔记] P9751 [CSP-J 2023] 旅游巴士
    Problem_LinkDescription给定一个\(n\)个点,\(m\)条边的有向图。起点为\(1\),终点为\(n\)。起始时间和终止时间必须是\(k\)的倍数。通过每条边的时间为\(1\)。每条边有限制\(a_i\)即若通过当前边必须满足当前时间\(t\geqa_i\)。求满足上述限制的前提下,到达终点的最小......
  • A trip through the Graphics Pipeline 2011: Index
    原文地址https://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/Welcome.ThisistheindexpageforaseriesofblogpostsI’mcurrentlywritingabouttheD3D/OpenGLgraphicspipelinesasactuallyimplementedbyGPUs.Alot......
  • CVE-2016-3088-复现
    最近要做应急演练,用到了这个漏洞,就顺便记录一下这个靶场的流程环境就不记录了,用的是vulhub的靶场参考链接:https://www.bilibili.com/read/cv12103854/https://blog.csdn.net/weixin_44047654/article/details/128033455ps:关于该漏洞的成因,我对代码审计不是很懂,这里就不记录了,......