[questions chaudes leetcode 100] Enregistrement des questions (5-8)

5. La sous-chaîne palindrome la plus longue

Lien vers les questions

Étant donné une chaîne s, recherchez-la sdans 最长的回文子串.

Insérer la description de l'image ici

 
 
Réponses aux questions

L'idée est une programmation dynamique.
Définition de l'état : dp[i][j]Indique si la chaîne de ià jest une chaîne palindrome.Transfert
d'état :
s[i] == s[j]divisé en deux types, un de longueur inférieure ou égale à 3 dp[i][j]==True; dans les autres cas dp[i][j] = dp[i+1][j-1];

s[i] != s[j]alors dp[i][j] = False;

réponse python

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        # 初始化dp数组
        dp = [[False]*(n) for _ in range(n)]
        # 边界条件 单个字符是属于回文字符串的
        for i in range(n): dp[i][i] = True
        # 定义一下最长长度和初始位置
        maxlen, idx = 1, 0
        # 按照长度来遍历
        for lens in range(2, n + 1):
            for st in range(0, n - lens + 1):
                end = st + lens - 1

                if s[st] == s[end]: # 字符相等的时候,看长度, 分两种情况
                    if lens <= 3:
                        dp[st][end] = True
                    else:
                        dp[st][end] = dp[st+1][end-1]
                else: # 字符不相等的时候,必然不是
                    dp[st][end] = False
                
                # 更新一下最优状态
                if dp[st][end] and lens > maxlen:
                    maxlen = lens
                    idx = st

        return s[idx:idx+maxlen]

réponse du RPC

class Solution {
    
    
public:
    string longestPalindrome(string s) {
    
    
        int n = s.size();
        if (n < 2) {
    
    
            return s;
        }

        int maxLen = 1;
        int begin = 0;

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

        for (int l = 2; l <= n; l ++)
        {
    
    
            for (int i = 0; i < n; i ++)
            {
    
    
                int j = i + l - 1;
                if (j >= n) break;
                if (s[i] == s[j])
                {
    
    
                    if (l <= 3) dp[i][j] = true;
                    else dp[i][j] = dp[i+1][j-1];
                }
                else
                {
    
    
                    dp[i][j] = false;
                }
				
				// 更新最优状态
                if (dp[i][j] && l > maxLen)
                {
    
    
                    maxLen = l;
                    begin = i;
                }
            }

        }

        return s.substr(begin, maxLen);
    }
};

2. Ajoutez deux nombres

Lien vers les questions

Vous recevez deux listes chaînées non vides, représentant deux entiers non négatifs. Chacun de leurs chiffres est stocké dans l'ordre inverse et chaque nœud ne peut stocker qu'un seul chiffre.

Veuillez ajouter deux nombres et renvoyer une liste chaînée représentant la somme sous la même forme.

Vous pouvez supposer qu’à l’exception du chiffre 0, aucun des deux nombres ne commencera par 0.

Insérer la description de l'image ici

 
 
Réponses aux questions

Il suffit de le simuler directement. Lorsque vous utilisez C++, faites attention à savoir si l'objet renvoyé est un pointeur ou un objet. S'il s'agit d'un pointeur, utilisez-le à la place d'un ->objet ..

réponse python

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        adds = 0 # 进位
        head = curr = ListNode(0)
        while l1 or l2 or adds:
            val = 0
            if l1: 
                val += l1.val
                l1 = l1.next
            if l2: 
                val += l2.val
                l2 = l2.next
            val, adds = (val + adds) % 10, (val + adds) // 10 
            node = ListNode(val)
            curr.next = node
            curr = curr.next
        return head.next

réponse du RPC

class Solution {
    
    
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    
    
        int adds = 0;
        ListNode *head = nullptr;
        ListNode *curr = nullptr;
        head = curr = new ListNode(0);
        while (l1 || l2 || adds)
        {
    
    
            int val = 0;
            if(l1)
            {
    
    
                val += l1->val;
                l1 = l1->next;
            }
            if(l2)
            {
    
    
                val += l2->val;
                l2 = l2->next;
            }
            curr->next = new ListNode((val + adds) % 10);
            adds = (val + adds) / 10;
            curr = curr->next;
        }
        return head->next;
    }
};

3. La sous-chaîne la plus longue sans caractères répétés

Lien vers les questions

Étant donné une chaîne s, veuillez trouver 不含有重复字符le .最长子串长度

Insérer la description de l'image ici

 
 
Réponses aux questions

Double pointeur plus ensemble

Faire glisser la fenêtre de gauche à droite. Si vous rencontrez setun élément qui n'est pas là, le pointeur droit continue de se déplacer vers la droite jusqu'à ce qu'il ne soit plus satisfait. Mettez à jour la distance la plus longue, puis ajoutez s[r]et supprimez s[l]. Je l'ai également enregistré ici final_l, ce qui équivaut à si la distance la plus longue est requise. Si la sous-séquence n'est pas répétée, sortez-la directement.s[final_l:final_l+res]

réponse python

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        l, r = 0, 0
        final_l = 0
        res = 0
        dic = set()
        while r < len(s):
            while r < len(s) and s[r] not in dic:
                dic.add(s[r])
                r += 1
            if r - l > res:
                res = r - l
                final_l = l
            dic.remove(s[l])
            l += 1
        return res

réponse du RPC

class Solution {
    
    
public:
    int lengthOfLongestSubstring(string s) {
    
    
        int l = 0, r = 0, res = 0, final_l;
        unordered_set<char> dic;
        while (r < s.size())
        {
    
    
            while (r < s.size() and dic.find(s[r]) == dic.end())
            {
    
    
                dic.insert(s[r]);
                r ++;
            }

            if (r - l > res)
            {
    
    
                res = r - l;
                final_l = l;
            }

            dic.erase(s[l]);
            l ++;

        }
        return res;
    }
};

4. Trouvez la médiane de deux tableaux positifs

Lien vers les questions

Étant donné deux tableaux ordonnés positivement (du petit au grand) et de tailles met respectivement . Veuillez trouver et renvoyer ces deux tableaux d'ordre positif .nnums1nums2中位数

La complexité temporelle de l'algorithme devrait être de O(log (m+n)).

Insérer la description de l'image ici

 
 
Réponses aux questions

二分查找

Plus précisément, il s'agit de trouver une division de deux tableaux et de la transformer en un problème de recherche des k premiers petits nombres. Lors de la division, il s'agit principalement de faire en sorte que les valeurs des éléments à gauche et à droite de la ligne de démarcation satisfassent la relation d’ordre d’intersection, puis discutez de certaines conditions aux limites. Pour plus de détails, veuillez consulter l'analyse du site officiel

réponse python

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        if len(nums1) > len(nums2):
            return self.findMedianSortedArrays(nums2, nums1)

        infinty = 2**40
        m, n = len(nums1), len(nums2)
        left, right = 0, m
        # median1:前一部分的最大值
        # median2:后一部分的最小值
        median1, median2 = 0, 0

        while left <= right:
            # 前一部分包含 nums1[0 .. i-1] 和 nums2[0 .. j-1]
            # // 后一部分包含 nums1[i .. m-1] 和 nums2[j .. n-1]
            i = (left + right) // 2
            j = (m + n + 1) // 2 - i

            # nums_im1, nums_i, nums_jm1, nums_j 分别表示 nums1[i-1], nums1[i], nums2[j-1], nums2[j]
            nums_im1 = (-infinty if i == 0 else nums1[i - 1])
            nums_i = (infinty if i == m else nums1[i])
            nums_jm1 = (-infinty if j == 0 else nums2[j - 1])
            nums_j = (infinty if j == n else nums2[j])

            if nums_im1 <= nums_j:
                median1, median2 = max(nums_im1, nums_jm1), min(nums_i, nums_j)
                left = i + 1
            else:
                right = i - 1

        return (median1 + median2) / 2 if (m + n) % 2 == 0 else median1

réponse du RPC

class Solution {
    
    
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
    
    
        if (nums1.size() > nums2.size()) {
    
    
            return findMedianSortedArrays(nums2, nums1);
        }
        
        int m = nums1.size();
        int n = nums2.size();
        int left = 0, right = m;
        // median1:前一部分的最大值
        // median2:后一部分的最小值
        int median1 = 0, median2 = 0;

        while (left <= right) {
    
    
            // 前一部分包含 nums1[0 .. i-1] 和 nums2[0 .. j-1]
            // 后一部分包含 nums1[i .. m-1] 和 nums2[j .. n-1]
            int i = (left + right) / 2;
            int j = (m + n + 1) / 2 - i;

            // nums_im1, nums_i, nums_jm1, nums_j 分别表示 nums1[i-1], nums1[i], nums2[j-1], nums2[j]
            int nums_im1 = (i == 0 ? INT_MIN : nums1[i - 1]);
            int nums_i = (i == m ? INT_MAX : nums1[i]);
            int nums_jm1 = (j == 0 ? INT_MIN : nums2[j - 1]);
            int nums_j = (j == n ? INT_MAX : nums2[j]);

            if (nums_im1 <= nums_j) {
    
    
                median1 = max(nums_im1, nums_jm1);
                median2 = min(nums_i, nums_j);
                left = i + 1;
            } else {
    
    
                right = i - 1;
            }
        }

        return (m + n) % 2 == 0 ? (median1 + median2) / 2.0 : median1;
    }
};

Je suppose que tu aimes

Origine blog.csdn.net/qq_36306288/article/details/124912836
conseillé
Classement