数组常用方法

二分法

  1. 使用二分查找法的前提是数组中无重复元素
  2. 写二分法,区间一般为2种:[left, right] 或者 [left, right)
    在这里插入图片描述
    定义区间[left, right]
  • while(left <= right)
  • 当nums[mid] > target时,说明target在[left, mid - 1]之间
  • 当nums[mid] < targe时,说明target在[mid + 1, right]之间
  • 当nums[mid] == target时,return mid;
    模板代码
class Solution {
	public int search(int[] nums, int target) {
		// 先判断target是否在nums范围内[有序数组]
		if (target < nums[0] || target > nums[nums.length - 1]) {
			return -1;
		}
		int left = 0, right = nums.length - 1;
		while (left <= right) {
			int mid = left + ((right - left) >> 1);
			if (nums[mid] > target) {
				right = mid - 1;
			} else if (nums[mid] < target) {
				left = mid + 1;
			} else {
				return mid;
			}
		}
		return -1;
	}
}
func search(nums []int, target int) int {
	right := len(nums) - 1
	left := 0
	for left <= right {
		mid := left + (right - left) / 2
		if nums[mid] > target {
			right = mid - 1
		} else if nums[mid] < target {
			left = mid + 1
		} else {
			return mid;
		}
	}
	return -1;
}

数组双指针法

class Solution {
    public int removeElement(int[] nums, int val) {
        // 快慢指针
        int fast = 0;
        int slow;
        for (slow = 0; fast < nums.length; fast++) {
            if (nums[fast] != val) {
                nums[slow] = nums[fast];
                // 这句很关键
                slow++;
            }
        }
        return slow;
    }
}
func removeElement(nums []int, val int) int {
    length:=len(nums)
    res:=0
    for i:=0;i<length;i++{
        if nums[i]!=val {
            nums[res]=nums[i]
            res++
        }
    }
    return res
}

滑动窗口

leetcode 209题

public int minSubArrayLen(int target, int[] nums) {
        int result = Integer.MAX_VALUE;
        int sum = 0;
        int start = 0; 
        int len = 0;

        for (int j = 0; j < nums.length; j ++) {
            sum += nums[j];
            // 累积到满足条件的窗口时,尝试缩短窗口
            // 不满足条件,记住当前满足条件的长度,向前继续移动窗口
            while (sum >= target) {
                len = j - start + 1;
                result = result < len ? result : len;
                // 缩短窗口后的sum
                sum -= nums[start ++];
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
 }
func minSubArrayLen(target int, nums []int) int {
    var (
        start int
        sum int
        length int
        result = len(nums) + 1
    )
    for end := 0; end < len(nums); end ++ {
        sum += nums[end]
        for sum >= target {
            length = end - start + 1
            if result > length {
                result = length
            }
            sum -= nums[start]
            start ++
        }
    }
    if result == len(nums) + 1 {
        return 0
    }
    return result
}

统计数组/字符串中数字/字符出现次数

// HashMap实现
Map<Integer/String..., Interger> count = new HashSet<>();
for (int/char key: nums/strs) {
	int time = count.getOrDefault(key, 0) + 1;
	map.put(key, time);
}
// 数字实现--针对字符串[小写或者大写]
int[] count = new int[26];
for (int/char index : nums/strs) {
	count[index - 'a'] ++;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值