“这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战”
485. 最大连续 1 的个数
题目描述
给定一个二进制数组, 计算其中最大连续 1 的个数。
输入:[1,1,0,1,1,1]
输出:3
解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.
解析
- 定义一个变量存储最大值,在定义一个递增的变量
- for循环,每次递增count
- 注意不为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. 排序链表
描述
给你链表的头结点 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个升序链表
描述
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例
输入: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);
};