给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions/xm0u83/
来源:力扣(LeetCode)
法1:1次遍历
简单,主要是循环结束后还要判断一次max和sum的大小,因为当最后几位是连续1时,最后一位判断完会直接跳出循环,而不把sum赋给max
执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:39.9 MB, 在所有 Java 提交中击败了41.95%的用户
法2:双指针
执行用时:224 ms, 在所有 Java 提交中击败了7.03%的用户
内存消耗:39.6 MB, 在所有 Java 提交中击败了86.13%的用户
package 数组;
public class 最大连续1的个数_485 {
/*
法1:1次遍历
简单,主要是循环结束后还要判断一次max和sum的大小,因为当最后几位是连续1时,最后一位判断完会直接跳出循环,而不把sum赋给max
执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:39.9 MB, 在所有 Java 提交中击败了41.95%的用户
*/
public static int findMaxConsecutiveOnes(int[] nums) {
int sum=0,max=0;
for (int i : nums) {
if (i==1){
sum++;
}else{
max=max>sum?max:sum;
sum=0;
}
}
//这行一开始忽略了,当最后几位是连续1时,最后一位判断完会直接跳出循环,而不把sum赋给max
max=max>sum?max:sum;
return max;
}
/*
法2:双指针
执行用时:224 ms, 在所有 Java 提交中击败了7.03%的用户
内存消耗:39.6 MB, 在所有 Java 提交中击败了86.13%的用户
*/
public static int findMaxConsecutiveOnes2(int[] nums){
int max=0,j;
for (int i = 0; i < nums.length; i++) {
//j获取当前指针位置
j=i;
//如果j对应值为1且索引不越界,则++
while(j< nums.length&&nums[j]==1)j++;
//j-i为这一段1的个数(连续的1是一段一段的)
max=max>(j-i)?max:(j-i);
}
return max;
}
public static void main(String[] args) {
int []a={1,1,0,1,1,1};
System.out.println(findMaxConsecutiveOnes2(a));
}
}