珠海做网站的公司,建设部网站被黑,泰安网站建设渠道,北京海淀中关村找工作网站题一#xff1a;删除有序数组中的重复项 给你一个 升序排列 的数组 nums #xff0c;请你 原地 删除重复出现的元素#xff0c;使每个元素 只出现一次 #xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的…题一删除有序数组中的重复项 给你一个 升序排列 的数组 nums 请你 原地 删除重复出现的元素使每个元素 只出现一次 返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k 你需要做以下事情确保你的题解可以被通过
更改数组 nums 使 nums 的前 k 个元素包含唯一元素并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。返回 k 。
思路一
暴力求解直接定义一个int类型取不到的数让这个数去判断与其他的数是否相同相同不理会不相同赋值到【left】位置left就是就是要输出的长度。
int removeDuplicates(int* nums, int numsSize)
{long num 80000000000;int left 0;for(int i 0;i numsSize; i){if(nums[i] ! num){num nums[i];nums[left] num;}}return left;
}
思路二 1. 设置一个计数记录从前往后遍历时遇到的不同元素的个数不同的元素需要往前搬移 2. 遍历数组如果nums[i]与nums[count]不等就将nums[i]搬移到nums[count]位置不同元素多了一个
3. 循环结束后将count(将【0】加上)返回count。
即nums[0]处不动nums[0]与nums[1]处比较不同就将nums[1]的值放入然后i然后与nums【1】比较循环这个操作一直判断到结束。
int removeDuplicates(int* nums, int numsSize){int count 0;for(int i 1; i numsSize; i){if(nums[count] ! nums[i] )nums[count] nums[i];}count;return count;
}
题二合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中使合并后的数组同样按 非递减顺序 排列。
注意最终合并后数组不应由函数返回而是存储在数组 nums1 中。为了应对这种情况nums1 的初始长度为 m n其中前 m 个元素表示应合并的元素后 n 个元素为 0 应忽略。nums2 的长度为 n 。
特别关注
递增1 2 3 4 5
非递减1 2 2 3 3 4不是递减递增但是有相同的元素
思路一 第一步从后往前遍历数组将nums1和nums2中的元素逐个比较将较大的元素往nums1末尾进行搬移
第二步第一步结束后nums2中可能会有数据没有搬移完将nums2中剩余的元素逐个搬移到nums1。
时间复杂度O(mn) 空间复杂度: O(1)
oid merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{int sz nums1Size;while(m 0 n 0){if(nums1[m-1] nums2[n-1]){nums1[sz-1] nums1[m-1]; m--;sz--;}else{nums1[sz-1] nums2[n-1];n--;sz--;}}if(m 0){while(n 0){nums1[sz-1] nums2[n-1];n--;sz--;}}}
本人实力有限可能对一些地方解释的不够清晰可以自己尝试读代码望海涵