Leetcode 995. K 连续位的最小翻转次数
题目:
在仅包含 0 和 1 的数组 A 中,一次 K 位翻转包括选择一个长度为 K 的(连续)子数组,同时将子数组中的每个 0 更改为 1,而每个 1 更改为 0。
返回所需的 K 位翻转的次数,以便数组没有值为 0 的元素。如果不可能,返回 -1。
示例 1:
输入:A = [0,1,0], K = 1
输出:2
解释:先翻转 A[0],然后翻转 A[2]。
示例 2:
输入:A = [1,1,0], K = 2
输出:-1
解释:无论我们怎样翻转大小为 2 的子数组,我们都不能使数组变为 [1,1,1]。
示例 3:
输入:A = [0,0,0,1,0,1,1,0], K = 3
输出:3
解释:
翻转 A[0],A[1],A[2]: A变成 [1,1,1,1,0,1,1,0]
翻转 A[4],A[5],A[6]: A变成 [1,1,1,1,1,0,0,0]
翻转 A[5],A[6],A[7]: A变成 [1,1,1,1,1,1,1,1]
提示:
1 <= A.length <= 30000
1 <= K <= A.length
思路:
参考了官方的题解,但不是很理解,后面尝试着加了一些适合自己脑回路的理解。
整体思路和官方是一样的,我们需要1个变量记录翻转次数是奇数次还是偶数次,还需要长度为n的数组去记载在某个位置需要翻转回来。
下面这个是官方的解释:
作者:LeetCode
链接:https://leetcode-cn.com/problems/two-sum/solution/k-lian-xu-wei-de-zui-xiao-fan-zhuan-ci-shu-by-leet/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
每次翻转一个子数组 A[i], A[i+1], ..., A[i+K-1],我们可以考虑这样的两种事件:第一种是 “开始事件”,标记位置 i 为我们翻转子数组的开始,另一种是 “结束事件” ,标记位置 i+K 是我们翻转子数组的结束。使用这些事件,我们就可以知道某一个位置被多少个重叠的翻转子数组覆盖了:它的数值等于 “开始事件” 的数量减去 “结束事件” 的数量。
当我们翻转子数组形如A[i]...A[i + k - 1],总共k个。
我们可以在此位置置反翻转状态,并且在位置 A[i + k] 设置一个提醒,告诉我们在那里也要置反翻转状态。
为什么到A[i + k]时需要翻回来呢?
我们将翻转状态置反,说明了需要翻转的区间为[i, i + k - 1],到了i + k时,翻转状态再一次置反,说明不需要翻转。
接下来是我在官方原代码上加的一些自己的理解。
class Solution {
public int minKBitFlips(int[] A, int K) {
int N = A.length;
int res = 0, fli = 0;
int[] fan = new int[N];
for(int i = 0; i < N; ++i){
fli ^= fan[i]; //异或是不进位的加法
/* fli(原) fan[i] fli(现)
0 0 0 不需要操作
0 1 1 这里需要翻的次数要加1,从偶数次变为奇数次
1 0 1 原先翻过奇数次,现在不用管,还是奇数次
1 1 0 原先翻过奇数次,现在再翻一次,变为偶数次
*/
if(A[i] == fli){ /*有两种情况:1.fli翻过奇数次,而原A[i]为1,说明还要再翻;
2.fli翻过偶数次,而原A[i]为0,说明还要再翻;*/
++res;
if(i + K > N){
return -1;
}
fli ^= 1; //相当于fli = (fli + 1) % 2
if(i + K < N){
fan[i + K] ^= 1; //相当于fan[i + K] = (fan[i + K] + 1) % 2
}
}
}
return res;
}
}
时间复杂度(n );
空间复杂度(n );
Leetcode 995. K 连续位的最小翻转次数的更多相关文章
- [Swift]LeetCode995. K 连续位的最小翻转次数 | Minimum Number of K Consecutive Bit Flips
In an array A containing only 0s and 1s, a K-bit flip consists of choosing a (contiguous) subarray o ...
- Java实现 LeetCode 801 使序列递增的最小交换次数 (DP)
801. 使序列递增的最小交换次数 我们有两个长度相等且不为空的整型数组 A 和 B . 我们可以交换 A[i] 和 B[i] 的元素.注意这两个元素在各自的序列中应该处于相同的位置. 在交换过一些元 ...
- [链表]LeetCode 25 K组一个翻转链表
LeetCode 25 k组一个翻转链表 TITLE 示例 1: 输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5] 示例 2: 输入:head = [1,2,3, ...
- Java实现 LeetCode 25 K个一组翻转链表
25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...
- [LeetCode] 25. k个一组翻转链表
题目链接: https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 题目描述: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链 ...
- [LeetCode] 25. K 个一组翻转链表 ☆☆☆☆☆(链表)
https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/javadi-gui-fang-fa-100-by-chadriy ...
- LeetCode 25. k个一组翻转链表(Reverse Nodes in k-Group)
题目描述 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定 ...
- leetcode 25. K 个一组翻转链表
# coding:utf-8 __author__ = "sn" """ 25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返 ...
- LeetCode 25. K 个一组翻转链表 | Python
25. K 个一组翻转链表 题目来源:https://leetcode-cn.com/problems/reverse-nodes-in-k-group 题目 给你一个链表,每 k 个节点一组进行翻转 ...
随机推荐
- python学习Day27--time模块、sys模块、os模块和序列化模块
[知识点] 1.时间模块: (1)时间戳时间,格林威治时间,float数据类型 英国伦敦的时间:1970.1.1 0:0:0 北京时间:1970.1.1 8:0:0 (2)结构化时间, ...
- Java范型学习笔记
对于范型的使用或者说印象只有集合,其他地方即使使用过也不知道,反正就是只停留在List<E> Map<K, V>,最近刚好闲来无事,就找找资料学习一下:下列为个人学习总结,欢迎 ...
- Spring源码阅读笔记01:源码阅读环境准备
1. 写在前面 对于做Java开发的同学来说,Spring就像是一条绕不过去的路,但是大多数也只是停留在对Spring的简单使用层面上,对于其背后的原理所知不多也不愿深究,关于这个问题,我在平时的生活 ...
- RFC笔记—Neighbor Discovery for IP version 6 (IPv6)
Router Solicitation Message Source Address An IP address assigned to the sending interface, or the u ...
- ansible hosts配置
编辑/etc/ansible/hosts 添加本机的public SSH key到目标机器的authorized_keys #ssh-copy-id 添加本机的私钥到Ansible 运行ansib ...
- Angular RxJs:针对异步数据流编程工具
一. RxJs:针对异步数据流编程工具 1. 创建subject类对象(发送方) 2. subject.subscribe(观察者); (注册观察者对象observer,可以注册多个相当于回调函数取数 ...
- KVM管理工具webvirtmgr的使用
WebVirtMgr的日常配置:添加宿主机,创建虚拟机,磁盘扩容,快照等具体操作记录如下: 一.创建虚拟机 1.创建存储池 点击创建的宿主机,进入虚拟机部署界面 点击“存储池”按钮,创建存储池(即创建 ...
- ElasticSearch相关概念与客户端操作
一.Elasticsearch概述 Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document).然而它不仅仅是存储,还会索引(i ...
- ES[7.6.x]学习笔记(一)Elasticsearch的安装与启动
Elasticsearch是一个非常好用的搜索引擎,和Solr一样,他们都是基于倒排索引的.今天我们就看一看Elasticsearch如何进行安装. 下载和安装 今天我们的目的是搭建一个有3个节点的E ...
- 献给即将35岁的初学者,焦虑 or 出路?
导言:“对抗职场“35 岁焦虑”,也许唯一的方法是比这个瞬息万变的商业社会跑得更快!” 一直以来,都有许多人说“程序员或测试员是个吃青春饭的职业”,甚至还有说“35 岁混不到管理就等于失业”的言论. ...