数据结构算法题总汇
作者:互联网
2021年10月25日数组练习
题目一:leetcode136.只出现一次的数字
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解思路:
1.拿到题目后第一反应是借助一个hash表来进行记录,但是空间复杂度会变为O(n),不符合题意。代码如下:
public int singleNumber(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])){
map.put(nums[i],map.get(nums[i])+1);
}else{
map.put(nums[i],1);
}
}
for (Integer integer : map.keySet()) {
int count = map.get(integer);
if (count == 1){
return integer;
}
}
return -1;
}
2.由于上一个解法使用hash导致空间复杂度提高,所以随后想到使用排序算法进行解题,但是使用快排的时间复杂度也达到了O(nlogn),所以放弃。
public int singleNumber(int[] nums) {
Arrays.sort(nums);
int result = 0;
if(nums.length == 1){
return nums[0];
}
if (nums[0] != nums[1]){
return nums[0];
}
for (int i = 1; i < nums.length; i++) {
if (i== nums.length-1){
if (nums[nums.length-1] != nums[nums.length-2]){
return nums[nums.length-1];
}
break;
}
if (nums[i] == nums[i+1] || nums[i-1] == nums[i]){
}else{
result = nums[i];
}
}
return result;
}
3.由于本人能力不足,想到这里就到头了,所以就默默的打开了题解,看到了一种异或操作来解这题,异或操作是属于相同为0,不同为1的运算,所以刚好用来解这题。
public int singleNumber(int[] nums) {
int result = nums[0];
if (nums.length > 1){
for (int i = 1; i < nums.length ; i++) {
result = result ^ nums[i];
}
}
return result;
}
4.还有一种解法,暴力解法,这个解法就不做解释了,就是将一个元素拿出来对数组剩下的元素做对比,时间复杂度达到了O(n平方)。
标签:map,return,nums,int,length,算法,总汇,result,数据结构 来源: https://blog.csdn.net/m0_47954009/article/details/120947635