Given an array nums of 0s and 1s and an integer k, return True if all 1's are at least k places away from each other, otherwise return False.
Example 1:
Input: nums = [1,0,0,0,1,0,0,1], k = 2
Output: true
Explanation: Each of the 1s are at least 2 places away from each other.
Example 2:
Input: nums = [1,0,0,1,0,1], k = 2
Output: false
Explanation: The second 1 and third 1 are only one apart from each other.
Example 3:
Input: nums = [1,1,1,1,1], k = 0
Output: true
Example 4:
Input: nums = [0,1,0,1], k = 1
Output: true
Constraints:
1 <= nums.length <= 105
0 <= k <= nums.length
nums[i] is 0 or 1
一开始想到的是strstr那样的解法,还是调了一阵子才不off by one。T: O(n)
public boolean kLengthApart(int[] nums, int k) {if (nums ==null||nums.length==0|| k <0) {returnfalse; }for (int i =0; i <nums.length; i++) {if (nums[i] ==0) {continue; }for (int j =0; j < k && j + i +1<nums.length; j++) {if (nums[i + j +1] ==1) {returnfalse; } } }returntrue;}
一看答案,发现自己傻了
publicbooleankLengthApart(int[] nums,int k) {// initialize the counter of zeros to k// to pass the first 1 in numsint count = k;for (int num : nums) {// if the current integer is 1if (num ==1) {// check that number of zeros in-between 1s// is greater than or equal to kif (count < k) {returnfalse; }// reinitialize counter count =0;// if the current integer is 0 } else {// increase the counter++count; } } returntrue;}
publicbooleankLengthApart(int[] nums,int k) {// convert binary array into intint x =0;for (int num : nums) { x = (x <<1) | num; }// base caseif (x ==0|| k ==0) {returntrue; }// remove trailing zeroswhile ((x &1) ==0) { x = x >>1; }while (x !=1) {// remove trailing 1-bit x = x >>1;// count trailing zerosint count =0;while ((x &1) ==0) { x = x >>1;++count; }// number of zeros in-between 1-bits// should be greater than or equal to kif (count < k) {returnfalse; } }returntrue;}