数组类算法

1. 移动零

题目描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

代码实现

public void moveZeroes(int[]nums) {
/**
使用两个指针:
	i --> 当前遍历的元素下标
	j --> 实际不为0的元素下标
*/
		int j = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                if (i > j) {
                    nums[j] = nums[i];
                    nums[i] = 0;
                }
                //元素不是0 j++
                j++;
            }
        }
	}

//简单思路(效率低)
public void moveZeroes(int[]nums) {
		int count=0;
		for (int i = 0; i < nums.length; i++) {
			if (nums[i]==0) {
				count++;
			}else {
				nums[i-count]=nums[i];
			}
		}
		for (int i = nums.length-count; i < nums.length; i++) {
			nums[i]=0;
		}
		System.out.println(Arrays.toString(nums));
	}

2.移除元素

题目描述

在这里插入图片描述

代码实现


	public int removeElement(int[] nums, int val) {
		int j = 0;
		int lens=nums.length;
		for (int i = 0; i < nums.length; i++) {
			if (nums[i] != val) {
				if (i > j) {
					nums[j] = nums[i];
					nums[i] = val;
				}
				j++;
			}else {
				lens--;
			}
		}
		return lens;
	}

3.删除排序数组中的重复项

题目描述

在这里插入图片描述

代码实现


	public int removeDuplicates(int[] nums) {
		int j = 1;
		int lens = nums.length;
		for (int i = 1; i < nums.length; i++) {
			if (nums[i] != nums[i - 1]) {
				if (i > j) {
					nums[j] = nums[i];
//					nums[i]=nums[i-1];
				}
				j++;
			} else {
				lens--;
			}
		}
		return lens;
	}

方法二:

	public int removeDuplicates1(int[] nums) {
		 if (nums.length == 0) return 0;
		    int i = 0;
		    for (int j = 1; j < nums.length; j++) {
		        if (nums[j] != nums[i]) {
		            i++;
		            nums[i] = nums[j];
		        }
		    }
		    return i + 1;
	}

4.删除排序数组中的重复项 II

题目描述

在这里插入图片描述

代码实现


		int j=1;
		boolean flag=true;
		int lens=nums.length;
		for (int i = 1; i < nums.length; i++) {
			if (nums[i] != nums[i - 1]) {
				flag=true;
				if (i > j) {
					nums[j] = nums[i];
//					nums[i]=nums[i-1];
				}
				j++;
			} else if (nums[i] == nums[i - 1]&&flag) {
				flag=false;
				nums[j]=nums[i];
				j++;
			}else {
				lens--;
			}
		}
		return lens;
	

5.颜色分类

题目描述

在这里插入图片描述

代码实现

public static void swap(int[] nums,int i,int j) {
		int temp=nums[i];
		nums[i]=nums[j];
		nums[j]=temp;
	}

	//1 0 2 1
	/*0 1 2 1
	 *0 1 1 2
	 * 
	 * **/
	public static void sortColors2(int[] nums) {
		int left=-1;
		int right=nums.length;
		int i=0;
		while (i<right) {
			if (nums[i]==0) {
				left++;
				swap(nums, left, i);
				i++;
			}else if (nums[i]==2) {
				right--;
				swap(nums, right, i);
			}
			else {
				i++;
			}
		}
	}

具体解析

请点击次链接跳转

6.两数之和 II

题目描述

在这里插入图片描述

代码实现

public int[] twoSum(int[] numbers, int target) {
		int index1 = 0;
		int index2 = numbers.length - 1;
		int sum=0;
		while (index1<index2) {
			sum=numbers[index1]+numbers[index2];
			if (sum<target) {
				index1++;
			}else if (sum>target) {
				index2--;
			}else if (sum==target) {
				break;
			}
		}
		return new int[]{index1+1,index2+1};
	}

7.验证回文串

题目描述

在这里插入图片描述

代码实现

public static boolean isPalindrome(String s) {
		s=s.toLowerCase();
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < s.length(); i++) {
			if (s.charAt(i) <= 122 && s.charAt(i) >= 97 || s.charAt(i) <= 57 && s.charAt(i) >= 48) {
				sb.append(s.charAt(i));
			}
		}
		if (sb.toString().equals(sb.reverse().toString())) {
			return true;
		}
		return false;
	}

8.反转字符串中的元音字母

题目描述

在这里插入图片描述

代码实现


	public String reverseVowels(String s) {
		if (s==null||s.length()==0) {
			return s;
		}
		String vowels="aeiouAEIOU";
		//将字符串转换成char类型数组
		//一般遇见字符串问题,能转成字符数组就尽量转(方便);
		char[] chars=s.toCharArray();
		int start=0;
		int end=s.length()-1;
		while (start<end) {
			//双指针相向而行,找元音字母
			while (start<end&&!vowels.contains(chars[start]+"")) {
				start++;
			}
			while (start<end&&!vowels.contains(chars[end]+"")) {
				end--;
			}
			swap(chars, start, end);
			start++;
			end--;
		}
		return new String(chars);
	}
	private void swap(char[] chars,int start,int end) {
		char temp=chars[start];
		chars[start]=chars[end];
		chars[end]=temp;
	}

9.盛最多水的容器

题目描述

在这里插入图片描述

代码实现


	public int maxArea(int[] height) {
//		int lt=0;
//		int rg=height.length-1;
		int area=Integer.MIN_VALUE;
		int res=Integer.MIN_VALUE;
		for (int i = 0; i < height.length; i++) {
			for (int j = 1; j < height.length; j++) {
				area=Math.min(height[i], height[j])*(j-i);
				res=Math.max(area, res);
			}
		}
		return res;
	}
	//方法二:效率更高
	public int maxArea2(int[] height) {
		int l=0,r=height.length-1;
		int ans=0;
		while (l<r) {
			int area=Math.min(height[l], height[r])*(r-l);
			ans=Math.max(ans, area);
			if (height[l]<=height[r]) {
				++l;
			}else {
				--r;
			}
			
		}
		return ans;
	}

10.长度最小的子数组

题目描述

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

示例:

输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

代码实现

 public int minSubArrayLen(int s, int[] nums) {
    	int n=nums.length;
    	if (n==0) {
			return 0;
		}
    	int left=0;
    	int right=0;
    	int sum=0;
    	int min=Integer.MAX_VALUE;
    	while (right<n) {
			sum+=nums[right];
			right++;
			while (sum>=s) {
				min=Math.min(min, right-left);
				sum-=nums[left];
				left++;
			}
		}
    	return min==Integer.MAX_VALUE?0:min;
    }

这道题目的详细解法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sparky*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值