题目1
题目:删除数组中重复的元素,数组是排好序的,使所有的元素都只出现一次,如{1,1,2,3}变为{1,2,3},不允许申请额外的数组。
时间复杂度:O(n)
空间复杂度:O(1)
思路比较难表达清楚,其实只要画个图就很好理解,前后两个索引 index 与 i,只要出现重复元素index就呆在原地不动,i继续往前走,index与i之间的元素都是重复的元素。
package com.cn;
public class DeleteRepeatElement {
public static void main(String[] args) {
int[] a = new int[]{1,1,2,2,3,3,4};
Delete(a);
}
public static void Delete(int[] a){
int n = a.length - 1;
int index = 0;
for(int i = 1; i <= n; i++){
if(a[i] != a[index]){
index++;
a[index] = a[i];
}
}
for(int j = 0; j <= index; j++){
System.out.print(a[j] + " ");
}
}
}
题目2
题目:同上题,数组中的元素最多出现两次
重复的元素最多出现两次,而且数组是排好序的,所以可以不管前两个元素,第三个元素与第一个元素比较,如果第三个元素与第一个元素是相同的,则说明这三个元素都是相同的,第三个元素的位置需要被别的元素替换掉,所以index呆在原地不动,等待不与他相同的元素,同理index与i之间的元素都是重复的元素。
package com.cn;
public class TwoRepeatElement {
public static void main(String[] args) {
int[] a = new int[]{3,3,3,3,3,3};
Delete(a);
}
public static void Delete(int[] a){
int n = a.length - 1;
int index = 2;
for(int i = 2; i <= n; i++){
if(a[i] != a[index - 2]){
a[index] = a[i];
index++;
}
}
for(int j = 0; j < index; j++ ){
System.out.print(a[j] + " ");
}
}
}