原题地址
[https://leetcode.cn/problems/two-sum/]:
解题思路:
将数组中每个元素通过两次遍历使两数之差target,最后由结果target得到对应数组下标。此时算法的时间复杂度为O(n^2)。故而放弃此方法。
由于上种方法时间复杂度过大超出时间限制,所以改为通过使用hashmap来存储nums中的元素。通过一次遍历来判断target-nums[i]是否已经存在于数组nums[i]中了,如果已经存在于nums[i]中,则满足该数组中两数之和=target。此时的时间复杂度为O(n)。
代码如下:
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
int[] sum=new int[2];
for (int i = 0; i < nums.length; ++i) {
if (hashtable.containsKey(target - nums[i])) {
sum[0]=hashtable.get(target - nums[i]);
sum[1]=i;
return sum;
}
hashtable.put(nums[i], i);
}
return sum;
}
}
[https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/]:
解题思路**:
由题中原地删除重复出现的元素可知我们必须在原数组中完成重复元素的删除并在删除的同时减小数组的长度。
此处最好使用的是双指针算法
通过同向的快慢指针来实现在原地删除重复的元素。通过快指针来遍历数组判断是否有重复的元素,而慢指针则在元素不重复时将不重复的元素存储下来,其中慢指针所指位置的长度就是原地删除重复出现的元素之后的新的数组长度。
class Solution {
public int removeDuplicates(int[] nums) {
int fast=1;
int slow=1;
int size=nums.length;
if(size==0){
return 0;
}
while(fast<size){
if(nums[fast]!=nums[fast-1]){
nums[slow]=nums[fast];
slow++;
}
fast++;
}
return slow;
}
}
[https://leetcode.cn/problems/remove-element/description/]:
解题思路:
同样地,该题的要求为在原数组中移除指定值的元素。
对于该题则使用“排队插入算法”。使用count标记,如果是目标元素则count++,如果不是目标元素则为了将删除的元素填补上使nums[i-count]=nums[i];
代码如下:
class Solution {
public int removeElement(int[] nums, int val) {
int count=0;
int s=nums.length;
if(s==0){
return 0;
}
for(int i=0;i<s;i++){
if(nums[i]==val){
count++;
}else{
nums[i-count]=nums[i];
}
}
return s-count;
}
}
原题地址
[https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/]:
解题思路
代码如下
class Solution {
public int maxProfit(int[] prices) {
int maxProfit= 0;
int minPrice = prices[0];
for (int i= 1; i <prices.length; i++) {
if( prices[i] - minPrice > maxProfit) {
maxProfit = prices[i] - minPrice;
}
if (prices[i] < minPrice) {
minPrice = prices[i];
}
}
return maxProfit;
}
}