Skip to content

YpandaGit/LeetCodeSample4J

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 

Repository files navigation

LeetCodeSample4J

初级算法

数组

  • 从排序数组中删除重复项

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

class Solution {
    public int removeDuplicates(int[] nums) {
        int i = 0;// 当前下标
        int j = 1;// 比较下标
        for (; j < nums.length;j++) {
            if(nums[i] != nums[j]){
                i++;
                nums[i] = nums[j];
            }
        }
        return i+1 ;// 数组长度 下标+1
    }
}
  • 买卖股票的最佳时机 II

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

解题思路:只要今天比明天便宜,就应该进行一次买卖!

class Solution {
    public int maxProfit(int[] prices) {
        int sum = 0;
        for(int i = 0; i< prices.length-1; i++){
            if(prices[i]<prices[i+1]){
                sum = sum + prices[i+1] - prices[i];
            }
        }
        return sum;
    }
}
  • 旋转数组

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。要求使用空间复杂度为 O(1) 的原地算法。

解题思路:我这只提供了一种实现方式,即每次移动整个数组一个位置,移动几个位置,就循环几次。该算法理解简单,但是效率不高,不推荐!在leetCode上有部分代码新建了一个数组,这也是一种思路。

class Solution {
    public void rotate(int[] nums, int k) {
        int tmp = -1;
        for(;k>0;k--){
            tmp = nums[nums.length-1];
            for(int i = nums.length-1; i > 0; i--){
                nums[i] = nums[i-1];
            }
            nums[0] = tmp;
        }
    }
}
/**
* 效率更高的算法调用了本地代码
/
class Solution {
    public void rotate(int[] nums, int k) {
        k=k%nums.length;
        int[] tmp=nums.clone();
        System.arraycopy(tmp,tmp.length-k,nums,0,k);
        System.arraycopy(tmp,0,nums,k,tmp.length-k);
    }
}
  • 存在重复

定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

解题思路:可以先排序,然后循环两两比较;也可以直接借助SET集合来

class Solution {
    public boolean containsDuplicate(int[] nums) {
        HashSet<Integer> set = new HashSet<>();
	    for(int i = 0; i< nums.length;i++) {
	        set.add(nums[i]);
	    }
	    if(set.size()<nums.length) {
	        return true;
	    }
	    return false;
    }
}
  • 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

解题思路:简单的就像如下代码实现,i+=2的原因是根据题目可得该数组的长度永远是单数,且只出现一次的元素只能出现在下标为偶数的位置,如下实现,效率并不高,如果是对异或了解的小伙伴可以利用异或的性质来实现。

class Solution {
    public int singleNumber(int[] nums) {
        			Arrays.sort(nums);
			int len = nums.length;
            if(nums.length == 1){
                return nums[0];
            }    
        
			// 出现在末位
			if(nums[len-3] == nums[len-2]) {
				return nums[len-1];
			}
			
	        for(int i = 0; i< nums.length-1; i+=2) {
	        	if(nums[i] != nums[i+1]) {
	        		return nums[i];
	        	}
	        }
	        return -1;
    }
}

About

用JAVA实现LeetCode上面的算法问题

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published