题目描述:
给你一个下标从 0 开始的整数数组 nums 以及一个目标元素 target 。
目标下标 是一个满足 nums[i] == target 的下标 i 。
将 nums 按 非递减 顺序排序后,返回由 nums 中目标下标组成的列表。如果不存在目标下标,返回一个 空 列表。返回的列表必须按 递增 顺序排列。
说明:
这一题我是按标签二分查找找到的,但是官方解题是直接排序加遍历,所以我是写完了二分查找之后在用排序遍历的所以有两种方法
解题思路1
先对nums排序,然后用二分查找找出符合target值的元素下标。定义一个arr数组去存储元素下标,定义一个变量num1去记录存储了多少次,再对arr数组进行排序就符合了题目要求的递增排序。由于一开始不知道有多少个符合target值的元素,所以我arr数组的长度是和nums数组的长度是一样的,所以再定义一个num数组长度是num1。这样可以保证num1中没有空值了,再把num赋值给列表numbers这样列表就是 递增 顺序排列了,返回列表就完成了这道题。
class Solution {
public List<Integer> targetIndices(int[] nums, int target) {
Arrays.sort(nums);
int a = 0,b = nums.length-1,c = 0; //a和b是指针范围,c是用来记录arr数组的下标
int [] arr = new int [nums.length];
List<Integer> numbers = new ArrayList<>();
int num1 = 0;
while(a <= b){
int m = (a + b) / 2;
if(target == nums[m]){
int i = m - 1;
int j = m + 1;
arr[c] = m;
c++;
num1++;
while (i >= 0 && nums[i] == target) {
arr[c] = i;
c++;
i--;
num1++;
}
while (j < nums.length && nums[j] == target) {
arr[c] = j;
c++;
j++;
num1++;
}
break;
}else if(target > nums[m]){
a = m + 1;
}else if(target < nums[m]){
b = m - 1;
}
}
int [] num = new int [num1] ;
for(int i = 0;i < num.length;i++){
num[i]=arr[i];
}
Arrays.sort(num);
for(int i = 0;i <num.length ;i++){
numbers.add(num[i]);
}
return numbers;
}
}
思路2
先对nums数组排序,再遍历数组查找符合target值的元素,再把元素下标直接赋值给列表numbers返回列表就是 递增 顺序排列。
class Solution {
public List<Integer> targetIndices(int[] nums, int target) {
Arrays.sort(nums);
List<Integer> numbers = new ArrayList<>();
for(int i = 0;i < nums.length;i++){
if(nums[i] == target){
numbers.add(i);
}
}
return numbers;
}
}
总结:
第一种方法由于我第一天学习二分查找所以写了一天一直再改错积累了很多经验,对二分查找有了更深刻的认识,对一个数组中用二分查找查询多个相同的数思路上有了更多方向。至于第二种方法我只能说不要被官方标签骗了虽然我是为了刷二分查找的题,但是官方标签虽然是二分查找但是解题却没有二分查找,但是一题多解也是可以锻炼我们的思路,可以让我们今后再遇到类似的方法的时候有最优解。