算法从入门到放弃 -- leetcode新手村初级刷题(一)

458 阅读1分钟

一:判断根结点是否等于子结点之和

题目:乐扣链接

截屏2022-11-06 下午1.32.04.png 代码:

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var checkTree = function(root) {
    return root.val === (root.left.val + root.right.val)
};

二:删除有序数组中的重复项

题目:乐扣链接

截屏2022-11-07 下午5.16.28.png 思路:

截屏2022-11-07 下午5.25.12.png 双指针指向同一个数组

快指针用来扫描,找到非重复的元素

慢指针用来指向可覆盖的位置

截屏2022-11-07 下午5.31.12.png

代码一

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    if(nums.length === 0){
        return 0
    }
    let slow=1
    for(let fast = 1; fast < nums.length; fast++){
        if(nums[fast] !== nums[fast - 1]){
            nums[slow] = nums[fast]
            ++slow
        }
    }
    return slow
};

代码二(官方答案):

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    const n = nums.length
    if(n === 0){
        return 0
    }
    let fast = 1, slow = 1;
    while(fast < n){
        if(nums[fast] !== nums[fast -1]){
            nums[slow] = nums[fast]
            ++slow
        }
        ++fast
    }
    return slow
};

三:合并两个有序链表

题目:乐扣链接

截屏2022-11-07 下午6.22.27.png

代码一:

/**
 * @param {ListNode} list1
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeTwoLists = function(list1, list2) {
    if(list1 === null){
        return list2
    }else if(list2 === null){
        return list1
    }else if(list1.val < list2.val){
        list1.next = mergeTwoLists(list1.next, list2)
        return list1
    }else {
        list2.next = mergeTwoLists(list1, list2.next)
        return list2
    }
};

四:数组中的第K个最大元素

题目: 截屏2022-11-15 下午3.54.14.png 说明: 此题最终的目的是考察排序。

插入排序:将末排序的元素一个一个地插入到有序的集合中,插入时把所有有序集合从后往前扫一遍,找到合适的位置插入。

在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。

知识点:sort()排序,快速排序。

ebb2f96563014c0e95b2d57f4dbce51f.gif 代码一:

 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
    insertSort(nums)
    let ans = nums.splice(k-1, 1)
    return ans
};
var insertSort = function(nums){
    let j
    for(let i = 1;i < nums.length; i++){
        let cur = nums[i]
        for(j = i;j >= 1;j--){
            if(nums[j - 1] < cur){
                nums[j] = nums[j - 1]
            }else{
                break
            }
        }
        nums[j] = cur
    }
}

代码二:

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
    function func(a,b){
        return b - a
    }
    let array = nums.sort(func)
    let ans = array.splice(k-1, 1)
    return ans
};