题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
提示:
- 你可以假设 nums 中的所有元素是不重复的。
- n 将在 [1, 10000]之间。
- nums 的每个元素都将在 [-9999, 9999]之间。
思路
因为是无重复元素的有序序列(升序),故采用二分查找算法去实现是时间复杂度较好的一种方法,其中无重复元素的目的是为了保证每次的返回的下标都是唯一的。
public static void main(String[] args) {
int nums[] = {2, 3, 5, 6, 21, 23, 29};
System.out.println(binsearch(nums,0,nums.length-1,50));
}
static int binsearch(int num[],int left,int right,int target){
if (left <= right) {
int mid = (left + right) >> 1;
if (num[mid] == target) return mid;
if (num[mid] > target) return binsearch(num, left, mid - 1, target);
if (num[mid] < target) return binsearch(num, mid + 1, right, target);
}
return -1;
}
给你一个数组nums和一个值val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变,不需要考虑数组中超出新长度后面的元素。
例如:给定nums=[0,1,2,2,3,0,4,2],val=2,函数应该返回新的长度5,并且nums中的前五个元素为 0, 1, 3, 0, 4。 你不需要考虑数组中超出新长度后面的元素。
示例
输入
3 2 2 3
3
输出
2
复制代码
思路
- 首先输入数组元素和val,定义一个cnt值,并赋值为0,用来计算元素个数,即数组长度。
- 然后遍历数组,当元素值与val不同时,cnt++,当元素值与val值相同时,把其设置为最大值。
- 最后输出cnt,将数组排序。
具体实现
public static void main(String[] args) {
int txt[] = {3,2,2,3};
int count = delInArr(txt,2);
for (int i = 0;i < count;i++){
System.out.print(txt[i]+" ");
}
}
static int delInArr(int num[],int val){
int count = 0;
for (int i = 0;i < num.length; i++){
count += num[i] == val ? 1 : 0;
num[i] = num[i] == val ? Integer.MAX_VALUE : num[i];
}
Arrays.sort(num);
return count;
}