wy的leetcode刷题记录_Day66

Posted wy-1226

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wy的leetcode刷题记录_Day66相关的知识,希望对你有一定的参考价值。

wy的leetcode刷题记录_Day66

声明

本文章的所有题目信息都来源于leetcode
如有侵权请联系我删掉!
时间:2023-4-10

前言

目录

1019. 链表中的下一个更大节点

今天的每日一题是:1019. 链表中的下一个更大节点

题目介绍

给定一个长度为 n 的链表 head

对于列表中的每个节点,查找下一个 更大节点 的值。也就是说,对于每个节点,找到它旁边的第一个节点的值,这个节点的值 严格大于 它的值。

返回一个整数数组 answer ,其中 answer[i] 是第 i 个节点( 从1开始 )的下一个更大的节点的值。如果第 i 个节点没有下一个更大的节点,设置 answer[i] = 0 。

示例 1:

输入:head = [2,1,5]
输出:[5,5,0]

示例 2:

输入:head = [2,7,4,3,5]
输出:[7,0,5,5,0]

思路

一道简单的模拟题,分析题意下来就是,遍历整个节点,对于当前节点我们向后寻找第一个大于该节点的节点值,并将值放入一个vector,如果没有则放入0。

代码

/**
 * Definition for singly-linked list.
 * struct ListNode 
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) 
 *     ListNode(int x) : val(x), next(nullptr) 
 *     ListNode(int x, ListNode *next) : val(x), next(next) 
 * ;
 */
class Solution 
public:
    vector<int> nextLargerNodes(ListNode* head) 
        ListNode* curr=head;
        ListNode*next=head->next;
        vector<int> ans;
        while(curr->next)
        
            while(next)
            
                if(next->val>curr->val)
                
                    ans.push_back(next->val);
                    break;
                
                else
                
                    next=next->next;
                
            
            if(next==nullptr)
            
                ans.push_back(0);
            
            curr=curr->next;
            next=curr->next;
        
        ans.push_back(0);
        return ans;
    
;

收获

简单的模拟题

OI-WIKI

OI-WIKI
从今天起,开始较为系统的学习算法的一些基础,不再盲目刷题了。

LeetCode刷题笔记-数据结构-day7

文章目录

LeetCode刷题笔记-数据结构-day7

90.单词规律

1.题目描述

原题链接:90. 单词规律

2.解题思路

算法:哈希表

用两个哈希表:

  1. 一个哈希表记录pattern中每个字符对应str中的哪个字符串
  2. 一个哈希表记录str中的字符串对应pattern中的哪个字符
  3. 遍历过程中,如果发现有冲突就返回false
  4. 最后没有冲突,还需判断pattern是否全部对应了,也就是说是否还有剩余字符

3.代码

class Solution 
public:
    bool wordPattern(string str, string s) 
        unordered_map<char,string> hash1;
        unordered_map<string,char> hash2;
        int k=0;
        for(int i=0,j=0;i<s.size();i++)
        
            j=i;
            while(j<s.size()&&s[j]!=' ') j++;
            string t=s.substr(i,j-i);
            if(hash1.count(str[k])&&hash1[str[k]]!=t) return false;
            if(hash2.count(t)&&hash2[t]!=str[k]) return false;
    
            hash2[t]=str[k];
            hash1[str[k]]=t;
            k++;
            i=j;
        
        return k==str.size();
    
;

763.划分字母区间

1.题目描述

原题链接:763. 划分字母区间

2.解题思路

算法:哈希表+贪心

  1. 用一个哈希表记录每个字符出现的最末尾位置
  2. 我们只需要保证某个最小区间的所有的数的最小位置和最大位置都在这个区间,那么这个区间就可以加入答案
  3. 代码实现:可以用变量end记录符合要求区间的最大位置,start记录初始位置,直到i==end,说明已经符合要求了,可以加入
  4. 题目要求尽可能多的片段,所以只要符合要求2就可以加入答案

3.代码

class Solution 
public:
    vector<int> partitionLabels(string s) 
            map<char,int> hash;
            for(int i=0;i<s.size();i++) hash[s[i]]=i;
            vector<int> res;
            int start=0,end=0;
            for(int i=0;i<s.size();i++)
                end=max(hash[s[i]],end);
                if(end==i)
                    res.push_back(end-start+1);
                    start=end=i+1;
                
            
            return res;
    
;

以上是关于wy的leetcode刷题记录_Day66的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题笔记-数据结构-day7

Leetcode刷题100天—551.学生出勤记录I(字符串)—day12

202004leetcode刷题记录

Leetcode刷题100天—_150_逆波兰表达式求值(栈)—day04

Leetcode刷题100天—_150_逆波兰表达式求值(栈)—day04

Leetcode刷题100天—1109. 航班预订统计(数组)—day24