说明:算法题目来源于lintcode,仅限于本人学习使用。请支持正版!
题目
给定一个数组 nums 以及一个整数 target 。
你需要把数组中等于target的元素移动到数组的最前面,并且其余的元素相对顺序不变。
你的所有移动操作都应该在原数组上面操作。
解题代码
使用冒泡排序来解这道题
public void moveTarget(int[] nums, int target) {
// write your code here
for(int i = 1; i < nums.length; i++){
for(int j = i ; j > 0; j--){
if(nums[j] == target && nums[j] != nums[j-1]){
nums[j] = nums[j-1];
nums[j-1] = target;
}else {
break;
}
}
}
}
其他思路
这种解法在时间复杂度上会减少一个量级别。
可以理解为冒泡排序的优化解,left是对整个数组进行遍历,而right则是对进行替换的元素进行记录,通过nums[right] = nums[left]来保证符合要求的元素取出后,其余的元素排序能够不变。
public void MoveTarget(int[] nums, int target) {
int count = 0;
int left = nums.length - 1, right = nums.length - 1;
while (left >= 0) {
if (nums[left] != target) {
nums[right] = nums[left];
right -= 1;
} else {
count += 1;
}
left -= 1;
}
for (int i = 0; i < count; i++) {
nums[i] = target;
}
}