[LeetCode]1089. Duplicate Zeros
Given a fixed length array arr of integers, duplicate each occurrence of zero, shifting the remaining elements to the right.
Note that elements beyond the length of the original array are not written.
Do the above modifications to the input array in place, do not return anything from your function.
Example 1:
Input: [1,0,2,3,0,4,5,0]
Output: null
Explanation: After calling your function, the input array is modified to: [1,0,0,2,3,0,0,4]
Example 2:
Input: [1,2,3]
Output: null
Explanation: After calling your function, the input array is modified to: [1,2,3]
Note:
1 <= arr.length <= 10000
0 <= arr[i] <= 9
Solution:
这题目的大概意思是让你遍历数组,如果遇到0就往0后面再添加一个0,之后的元素向右平移,超过数据长度的元素会被舍弃。
这里说只能原地修改数组,这句话有两种解释。第一个解释是不能使用额外的空间,第二个解释是不能返回新的数组(方法返回类型是void)。
解法一:队列标记替换
最直观的解法是,我们用一个队列保存需要平移的元素,然后遍历数组。如果队列不为空就用队列里最后加入的元素替换当前元素,如果遇到了0就把0加入到队列。
class Solution {
public void duplicateZeros(int[] arr) {
LinkedList<Integer> queue=new LinkedList<>();
for(int i=0;i<arr.length;i++){
if(0==arr[i]){
queue.add(arr[i]);
}
if(queue.size()>0){
queue.add(arr[i]);
arr[i]=queue.poll();
}
}
}
}
该解法性能如下:
执行用时 : 4 ms, 在所有 Java 提交中击败了57.21%的用户
内存消耗 :37.4 MB, 在所有 Java 提交中击败了100.00%的用户
解法二:双指针
双指针也许是本题的最优解法。具体思路是维护一个快指针和一个慢指针。快指针是遇到0
就多进一步。这样遍历一遍数据后,快指针和慢指针会有一个差值。这个差值就是需要填充0
的个数。
接下来,我们需要从后向前遍历数组。如果慢指针指向的元素不为0,则把快指针指向的元素替换为慢指针指向的元素;如果慢指针指向的元素为0,则把快指针和快指针之前指向的元素替换为0。
你可能会发现对于不同的数组,第一遍遍历之后fast指针的值是不一样的。区别在于数组末尾是否为0,如果末尾为0,则fast指针的值(数组索引)为数组长度+1。如果末尾不是0,则fast指针的值是数组长度。其实数组最后一位是0的话,其实是不用复制这个值的。因此从后向前遍历的时候需要判断fast指针的值是否小于n,这样就可以把数组末尾为0的时候就不会复制了。
class Solution {
public void duplicateZeros(int[] arr) {
int slow = 0;
int fast = 0;
int n = arr.length;
while (fast < n) {
if (arr[slow] == 0) {
fast++;
}
fast++;
slow++;
}
fast--;
slow--;
while (slow >= 0) {
if (fast < n) {
arr[fast] = arr[slow];
}
if (arr[slow] == 0) {
arr[--fast] = arr[slow];
}
fast--;
slow--;
}
}
}
该解法性能如下:
执行用时 : 1 ms, 在所有 Java 提交中击败了99.87%的用户
内存消耗 :37.1 MB, 在所有 Java 提交中击败了100.00%的用户
[LeetCode]1089. Duplicate Zeros的更多相关文章
- 【Leetcode_easy】1089. Duplicate Zeros
problem 1089. Duplicate Zeros 题意: solution: 其中关于虚拟新数组的下标的计算还是有点迷糊... class Solution { public: void d ...
- 【leetcode】1089. Duplicate Zeros
题目如下: Given a fixed length array arr of integers, duplicate each occurrence of zero, shifting the re ...
- LeetCode 1089. 复写零(Duplicate Zeros) 72
1089. 复写零 1089. Duplicate Zeros 题目描述 给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移. 注意:请不要在超过该数组长 ...
- LeetCode.1089-重复的0(Duplicate Zeros)
这是小川的第392次更新,第423篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第255题(顺位题号是1089).给定一个固定长度的整数数组arr,复制每次出现的零,将剩 ...
- [LeetCode] Remove Duplicate Letters 移除重复字母
Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...
- [LeetCode] Contains Duplicate III 包含重复值之三
Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...
- [LeetCode] Contains Duplicate II 包含重复值之二
Given an array of integers and an integer k, return true if and only if there are two distinct indic ...
- [LeetCode] Contains Duplicate 包含重复值
Given an array of integers, find if the array contains any duplicates. Your function should return t ...
- [LeetCode] Delete Duplicate Emails 删除重复邮箱
Write a SQL query to delete all duplicate email entries in a table named Person, keeping only unique ...
随机推荐
- Selenium 2自动化测试实战35(HTML测试报告)
HTML测试报告 显然,一份漂亮的测试报告展示自动化测试成果只有一个简单的log文件是不够的.HTMLTestRunner是python标准库unittest单元测试框架的一个扩展,它生成易于使用的H ...
- idea 中的new file 没有jsp
idea 的new file中没有你需要的文件,原因是IDEA认为当前包下不应该创建该文件,以就没有创建该文件的选项. 以jsp 文件为例.其他文件类似. 解决方法: File ---> pro ...
- springboot-自定义异常处理器
@Order(-1000) public class LocalExceptionResolver implements HandlerExceptionResolver { @Override pu ...
- unmix和conditional average:消混叠和条件均值
unmix 该程序用来消除“像素混叠”.所谓像素混叠,是值在自然场景的图像中,边缘线成像到cmos的像素上时,某些像素会刚好跨在该边缘线上. 这样的像素特点就是,其R.G.B三色像素梯度值不一致.比如 ...
- 20190905 - Uncaught SyntaxError: Unexpected token < 的解决
问题:Uncaught SyntaxError: Unexpected token < index:1 原因:js 路径不对
- 【AMAD】django-social-auth -- 让django使用社交网络oauth鉴权变得极为轻松!
简介 个人评分 简介 django-social-auth1集成的Oauth API包括: Google OpenID Google Oauth Google Oauth2 Yahoo OpenID ...
- 【计算机视觉】基于样本一致性的背景减除运动目标检测算法(SACON)
SACON(SAmple CONsensus)算法是基于样本一致性的运动目标检测算法.该算法通过对每个像素进行样本一致性判断来判定像素是否为背景. 算法框架图 由上图可知,该算法主要分为四个主要部分, ...
- 【机器学习】ICA特征提取
看完了ICA的一整套原理介绍后,感觉完整的介绍和andrew ng的课程中的ICA特征提取关系不是很大:在ICA的理论中,主要用于盲源分离的,也就是混合的观测数据X,通过一个正交的且其范数为1的分离矩 ...
- JAVA实验报告及第八周总结
JAVA第八周作业 实验报告六 实验一 编写一个类,在其main()方法中创建一个一维数组,在try字句中访问数组元素,使其产生ArrayIndexOutOfBoundsException异常.在ca ...
- MySQL优化——索引
内容来自:https://yq.aliyun.com/articles/214494?utm_content=m_31338 对此我们来详细分析下(也就是大家在面试时需要说的): 场景一,数据表规模不 ...