学而不思则罔,思而不学则殆
题目
删除数组中所有值为x的数据元素
算法一
思路:统计不等于x的个数
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
//算法一:统计不等于x的个数
private static void del_x_1(int[] ints, int delete) {
int k = 0;
for (int anInt : ints) {
if (delete != anInt) {
ints[k++] = anInt;
}
}
//k表示不等delete的个数
//[k,ints.length-1] 置为-1
for (int index = k; index < ints.length; index++) {
ints[index] = -1;
}
}
算法二
思路:统计等于x的个数
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
//算法二:统计等于x的个数
private static void del_x_2(int[] ints, int delete) {
//delete出现的次数
int deleteNum = 0;
for (int i = 0; i < ints.length; i++) {
int tmp = ints[i];
if (delete == tmp) {
deleteNum++;
} else {
ints[i - deleteNum] = tmp;//当前元素前移deleteNum个位置
}
}
//k表示不等delete的个数
//[k,ints.length-1] 置为-1
for (int index = ints.length - deleteNum; index < ints.length; index++) {
ints[index] = -1;
}
}
算法三
思路:双指针法
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
//算法三:双指针法
private static void del_x_3(int[] ints, int delete) {
int lowIndex = 0;
int fastIndex = 0;
for (int anInt : ints) {
if (anInt == delete) {
fastIndex++;//跳过delete
} else {
ints[lowIndex++] = ints[fastIndex++];
}
}
for (int i = lowIndex; i < ints.length; i++) {
ints[i] = -1;
}
}