1.只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
class Solution {
public int singleNumber(int[] nums) {
int [] values = new int[nums.length];
int index = 0;
for( int i = 0; i < nums.length; i++ ){
int flag = checkExist(values,nums[i]);
if( flag != -1){
//将传来的下标的值置空
values[flag] = 0;
}else{
// 保存未出现的值
values[index++] = nums[i];
}
}
for(int i = 0; i<values.length; i++){
// 如果值不为0直接输出
if(values[i] != 0){
return values[i];
}
}
return 0;
}
//如果存在该值则返回存储的下标
public int checkExist(int []nums, int value){
for(int i = 0; i<nums.length; i++){
if(nums[i] == value){
return i;
}
}
return -1;
}
}
2.多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
class Solution {
public int majorityElement(int[] nums) {
int num = nums.length;
//[0]保存值 [1]保存出现的次数
int[][] values = new int[num][2];
for( int i=0; i<num; i++){
// 判断是否存在
int index = checkGetIndex(values,nums[i]);
// 如果存在直接 让 出现的次数+1
if( index != -1){
values[index][1] += 1;
}else{
// 否则保存该值
values[i][0] = nums[i];
}
}
for( int i=0; i<num; i++){
if(values[i][1] >= num/2){
return values[i][0];
}
}
return 0;
}
public int checkGetIndex(int[][] values,int value){
for(int i = 0; i<values.length; i++){
if(value == values[i][0]){
return i;
}
}
return -1;
}
}
合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int result = m;
for(int i = 0; i < n; i++){
int curr = nums2[i];
for(int j = 0; j <= result; j++ ){
// 如果当前数组1的值大于数组2的,则插入进去
if( nums1[j] >= curr ){
// 插入下标即为j。
add(nums1,j,curr,result);
break;
}
//数组1遍历完了循环还没跳出去(即数组2没被加进去)说明当前数组2的值比数组1的任何一个数还要大,直接加到末尾就行。
if( j == result){
add(nums1,result,curr,result);
}
}
// 考虑到增加 了i个数组2的值,所以 数组1的有效位增大,所以是 m+i。
result += 1;
}
}
/*
nums为 num1
index为要插入的下标
value为要插入的值
m为当前i的有效值
*/
public void add(int[] nums,int index,int value,int m){
for(int i = m; i > index ; i--){
nums[i] = nums[i-1];
}
nums[index] = value;
}
}