一些小算法之compareTo 比较大小,最大值

一些小算法之compareTo 比较大小,最大值

方法一 使用Comparable简单实现

	/**
	 *   比较算法
	 * @param arr
	 * @return
	 */
	public static Comparable findMax(Comparable [] arr) {
		
		int maxIndex = 0;
		
		for (int i = 1; i < arr.length; i++) {
			if(arr[maxIndex].compareTo(arr[i]) < 0) {
				maxIndex = i;
			}
		}
		return arr[maxIndex];
	}

方法二 可以传入实现了Comparable任何类型的类

public static <T extends Comparable<? super T>> T contain(T [] arr) {
	int maxIndex = 0;
	for (int i = 1; i < arr.length; i++) {
		if(arr[maxIndex].compareTo(arr[i])<0) {
			maxIndex = i;
		}
	}
	return arr[maxIndex];
}

方法三

在方法二的基础上改进而来

	public static <T> T contain(T [] arr,Comparator<? super T> com) {
	int maxIndex = 0;
	for (int i = 1; i < arr.length; i++) {
		if(com.compare(arr[maxIndex] , arr[i]) < 0) {
			maxIndex = i;
		}
	}
		return arr[maxIndex];
	}

使用Comparator来实现compara()具体的比较方法不自己实现

class CaseInsensiticeCompare implements Comparator<String>{

@Override
	public int compare(String o1, String o2) {
		return o1.compareToIgnoreCase(o2);
	}
}

测试方法

	public static void main(String[] args) {
		String [] strs = {"AAA","aa","C"};
		String contain = GenericMemoryCell.contain(strs, new CaseInsensiticeCompare());
		System.out.println(contain);
	}

只要是实现了了Comparable接口的类都可以运用此方法!
这个方法的优秀之处就是应用多态,把父类作为形参,传递子类,实现了方法的重用,是一种泛型的雏形

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用CSharp实现滑动窗口中位数算法的示例代码: ``` using System; using System.Collections.Generic; namespace SlidingWindowMedian { class Program { static void Main(string[] args) { int[] nums = { 1, 3, -1, -3, 5, 3, 6, 7 }; int k = 3; double[] medians = MedianSlidingWindow(nums, k); foreach (double median in medians) { Console.WriteLine(median); } Console.ReadKey(); } public static double[] MedianSlidingWindow(int[] nums, int k) { List<double> medians = new List<double>(); SortedSet<int> minHeap = new SortedSet<int>(); SortedSet<int> maxHeap = new SortedSet<int>(Comparer<int>.Create((x, y) => y.CompareTo(x))); for (int i = 0; i < nums.Length; i++) { if (i >= k) { if (minHeap.Contains(nums[i - k])) { minHeap.Remove(nums[i - k]); } else { maxHeap.Remove(nums[i - k]); } } if (maxHeap.Count == 0 || nums[i] <= maxHeap.Max) { maxHeap.Add(nums[i]); } else { minHeap.Add(nums[i]); } if (maxHeap.Count > minHeap.Count + 1) { minHeap.Add(maxHeap.Max); maxHeap.Remove(maxHeap.Max); } else if (minHeap.Count > maxHeap.Count) { maxHeap.Add(minHeap.Min); minHeap.Remove(minHeap.Min); } if (i >= k - 1) { if (k % 2 == 0) { medians.Add(((double)maxHeap.Max + (double)minHeap.Min) / 2); } else { medians.Add((double)maxHeap.Max); } } } return medians.ToArray(); } } } ``` 该算法使用两个堆,一个最大堆和一个最小堆,来维护滑动窗口。最大堆存储滑动窗口中较小的一半元素,最小堆存储滑动窗口中较大的一半元素。 当新元素进入滑动窗口时,先将其插入最大堆或最小堆中,然后调整堆,以保持最大堆和最小堆的大小平衡。如果最大堆中的元素数量超过了最小堆中的元素数量,就将最大堆中的最大元素转移到最小堆中,以保持平衡。 当滑动窗口大小为奇数时,中位数就是最大堆中的最大元素。当滑动窗口大小为偶数时,中位数就是最大堆中的最大元素和最小堆中的最小元素的平均值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值