leetcode算法面试题:对称二叉树、对链表进行插入排序、多数元素

对称二叉树问题

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

参考答案

class Solution {
    
    
public:
    bool check(TreeNode *u, TreeNode *v) {
    
    
        queue <TreeNode*> q;
        q.push(u); q.push(v);
        while (!q.empty()) {
    
    
            u = q.front(); q.pop();
            v = q.front(); q.pop();
            if (!u && !v) continue;
            if ((!u || !v) || (u->val != v->val)) return false;
 
            q.push(u->left); 
            q.push(v->right);
 
            q.push(u->right); 
            q.push(v->left);
        }
        return true;
    }
 
    bool isSymmetric(TreeNode* root) {
    
    
        return check(root, root);
    }
};

对链表进行插入排序

从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。

插入排序算法:

  • 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。

  • 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。

  • 重复直到所有输入数据插入完为止。

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4

示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5

参考答案

class Solution {
    
    
public:
    ListNode* insertionSortList(ListNode* head) {
    
    
        if (head == nullptr) {
    
    
            return head;
        }
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* lastSorted = head;
        ListNode* curr = head->next;
        while (curr != nullptr) {
    
    
            if (lastSorted->val <= curr->val) {
    
    
                lastSorted = lastSorted->next;
            } else {
    
    
                ListNode *prev = dummyHead;
                while (prev->next->val <= curr->val) {
    
    
                    prev = prev->next;
                }
                lastSorted->next = curr->next;
                curr->next = prev->next;
                prev->next = curr;
            }
            curr = lastSorted->next;
        }
        return dummyHead->next;
    }
};

多数元素问题

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入:[3,2,3]
输出:3

示例 2:

输入:[2,2,1,1,1,2,2]
输出:2

参考答案

class Solution {
    
    
public:
    int majorityElement(vector<int>& nums) {
    
    
        int candidate = -1;
        int count = 0;
        for (int num : nums) {
    
    
            if (num == candidate)
                ++count;
            else if (--count < 0) {
    
    
                candidate = num;
                count = 1;
            }
        }
        return candidate;
    }
};

猜你喜欢

转载自blog.csdn.net/baidu_33164415/article/details/135027526
今日推荐