LeetCode刷题(2)

302 阅读1分钟

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战

485. 最大连续 1 的个数

leetcode 官网链接

题目描述

给定一个二进制数组, 计算其中最大连续 1 的个数。

输入:[1,1,0,1,1,1]
输出:3
解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.

解析

  1. 定义一个变量存储最大值,在定义一个递增的变量
  2. for循环,每次递增count
  3. 注意不为1的时候,将count重置成0
/**
 * @param {number[]} nums
 * @return {number}
 */
var findMaxConsecutiveOnes = function(nums) {
    let n = nums.length;
    let count = 0;
    let maxcount = 0;

    for(let i = 0; i < n; i++) {
        if (nums[i] == 1) {
            count++;
        } else {
            maxcount = Math.max(maxcount, count);
            count = 0;
        }
    }
    maxcount = Math.max(maxcount, count);
    return maxcount;
};

148. 排序链表

LeetCode链接

描述

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

进阶:

你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?

demo

输入:head = [4,2,1,3]
输出:[1,2,3,4]

解析

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
// 使用快慢指针的形式,获取中间节点
 var merge = function (left, right) {
   let result = new ListNode(0);
   let current = result;
   while (left && right){
         if (left.val < right.val) {
           current.next = left;
           left = left.next;
         } else {
           current.next = right;
           right = right.next;
         }
     current = current.next;
   }
   current.next = left || right;
   return result.next;
 }
var getMiddleNode = function (head) {
  let fast = head;
  let slow = head;
  
  while (fast !== null && fast.next !== null && fast.next.next !== null) {
         fast = fast.next.next;
    			slow = slow.next;
  }
  return slow;
}
var mergeSort = function (head) {
  // 获取中间节点
  let middle = getMiddleNode(head);
  let tmp = middle.next;
  middle.next = null;
  
  let left = head;
  let right = tmp;
  return merge(mergeSort(left), mergeSort(right));
}
// 归并排序
var sortList = function(head) {
  if (!head || !head.next) return head;
	return mergeSort(head);
};

23. 合并K个升序链表

leetcode-cn.com/problems/me…

描述

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

题解

这个题目主要是用归并排序去解决

按照归并排序去写,分治的思想

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode[]} lists
 * @return {ListNode}
 */
// 归并排序
var merge = function(left, right) {
  if (left == null && right == null) {return null;}
  if (left != null && right == null) return left;
  if (left == null && right != null) return right;

  let result = new ListNode(0);
  let current = result;

  while (left && right) {
    if (left.val < right.val) {
      current.next = left;
      left = left.next;
    } else {
      current.next = right;
      right = right.next;
    }
    current = current.next;
  }
  current.next = left || right;
  return result.next;
};
var mergeLists = function (arr) {
  if (arr.length <= 1) return arr[0];
  let middleIndex = Math.floor(arr.length / 2);
  let left = mergeLists(arr.slice(0, middleIndex));
  let right = mergeLists(arr.slice(middleIndex, arr.length));
  return merge(left, right);
}
var mergeKLists = function(lists) {
	if (lists.length === 0) return null;
  return mergeLists(lists);
};