Given an array and a value, remove all instances of that value in place and return the new length.
The order of elements can be changed. It doesn’t matter what you leave beyond the new length.
给一个数组,要求返回删除所有指定元素的数组。
解法一:
对数组进行排序(使用快排),然后用二分查找。代码略多,我以为运行效率会很低下提交上去会超时,结果竟然AC了。
int removeElement(vector<int>& nums, int val) {
int l = 0;
int r = nums.size() - 1;
int index;
vector<int>::iterator iter;
quickSort(nums, l, r);
do{
index = binarySearch(nums, val);
if (index != -1){
iter = nums.begin() + index;
nums.erase(iter);
}
} while (index != -1);
vector<int>(nums).swap(nums);
int newlength = nums.size();
return newlength;
}
void quickSort(vector<int>&nums, int l, int r){
if (l < r){
int i = l, j = r, pivot = nums[l];
while (i < j){
while (i<j && nums[j]>pivot){
j--;
}
if (i < j){
nums[i++] = nums[j];
}
while (i < j && nums[i] < pivot){
i++;
}
if (i < j){
nums[j--] = nums[i];
}
nums[i] = pivot;
quickSort(nums, l, i - 1);
quickSort(nums, i + 1, r);
}
}
}
int binarySearch(vector<int>& nums, int goal){
int low = 0;
int high = nums.size() - 1;
while (low <= high){
int middle = (low + high) / 2;
if (nums[middle] == goal){
return middle;
}
else if(nums[middle] > goal){
high = middle - 1;
}
else{
low = middle + 1;
}
}
return -1;
}
解法二:
参考:http://www.th7.cn/Program/c/201505/449486.shtml
只要遍历一遍就可以搞定,直接看代码
int removeElement2(vector<int>& nums, int val) {
int size = 0, length = nums.size();
for (int i = 0; i < length; i++){
if (nums[i] != val)
nums[size++] = nums[i];
}
return size;
}